data(){
//1.当前要渲染的组件名称
return{
comName: 'Left'
}
}
<component :is="comName">component>
<button @click="comName = 'Left'">展示Left组件button>
<button @click="comName = 'Right'">展示 Right组件button>
无法保持组件的状态
,此时可以使用vue内置的组件保持动态组件的状态。<keep-alive>
<component :is="comName">component>
keep-alive>
被缓存
时,会自动触发组件的deactivated
生命周期函数。被激活
时,会自动触发组件的activated
生命周期函数。<script>
export default {
//数据区
data(){
return {
number:0
}
},
//vue生命周期-创建周期
created() {
console.log('Left 组件被创建了')
},
//vue生命周期-销毁周期
destroyed(){
console.log('Left 组件被销毁了')
},
//keep-alive生命周期函数
activated(){
console.log('Left 组件被激活了-actived')
},
//keep-alive生命周期函数
deactivated(){
console.log('Left 组件被缓存了-deactivated')
}
}
script>
英文的逗号
分隔。<keep-alive include="Left,Right">
<component :is="comName">component>
keep-alive>
<keep-alive exclude="Left">
<component :is="comName">component>
keep-alive>
但是
:两个属性不能同时被使用<script>
export default {
//当设置了name属性后,组件的名称就是name属性的值
name: 'MyRight'
}
script>
<template>
<div class="left-container">
<h2>Left组件h2>
<slot>slot>
div>
template>
<template>
<div class="app-container">
<h1>App根组件h1>
<hr/>
<div class="box">
<Left>
<p>这是在使用Left组件时,内容区域插入的p标签p>
Left>
div>
div>
template>
<slot name="defaukt">这里是插槽默认的内容(后备内容)slot>
<template>
<div class="app-container">
<h1>App根组件h1>
<hr/>
<div class="box">
<Left>
<template #default>
<p>这是在使用Left组件时,内容区域插入的p标签p>
template>
Left>
div>
div>
template>
<template>
<div class="article-container">
<div class="header-box">
<slot name="title">标题slot>
div>
<div class="content-box">
<slot name="content">内容slot>
div>
<div class="footer-box">
<slot name="author">作者slot>
div>
div>
template>
<Article>
<template #title>
<h3>诗歌一首h3>
template>
<template #content>
<div>
<p>啊,你好呀,北京人p>
<p>啊,你好呀,湖北人p>
<p>啊,你好呀,新疆人p>
<p>啊,你好呀,甘肃人p>
div>
template>
<template #author>
<h4>douglash4>
template>
Article>
<template>
<div class="article-container">
<div class="content-box">
<slot name="content" msg="我是content插槽返回的内容">内容slot>
div>
div>
template>
<Article>
<template #content="obj">
<div>
<p>啊,你好呀,北京人p>
<p>啊,你好呀,湖北人p>
<p>啊,你好呀,新疆人p>
<p>啊,你好呀,甘肃人p>
<p>{{obj.msg}}p>
div>
template>
Article>
【概念】在每个Vue组件中,可以再directives节点下声明私有自定义指令。
【案例】使用私有自定义属性(给标题添加一个字体颜色)
<h1 v-color="color" >App根组件h1>
<h2 v-color="'red'" >App根组件h2>
export default {
//私有自定义指令的节点区
directives:{
//定义名为color的指令,指向一个配置对象
color:{
//为绑定到的HTML元素设置红色的文字
bind(el,binding){
// 形参中的el是绑定了此指令的,原生的DOM对象
// 形参中的binding是自定义属性对象,包含自定义属性的所有内容,可以从中获取到传入的值
el.style.color = binding.value
}
}
},
//数据区
data(){
return{
color:'blue'
}
},
}
【小结】 (只触发一次)
【自定义属性之update函数】
//私有自定义指令的节点区
directives:{
//定义名为color的指令,指向一个配置对象
color:{
//为绑定到的HTML元素设置红色的文字
bind(el,binding){
// 形参中的el是绑定了此指令的,原生的DOM对象
// 形参中的binding是自定义属性对象,包含自定义属性的所有内容,可以从中获取到传入的值
el.style.color = binding.value
},
// 每次 DOM 更新时被调用
update(el,binding){
el.style.color = binding.value
}
}
}
【函数简写】bind与update共存,且函数体一致时可以简写如下:
//私有自定义指令的节点区
directives:{
//定义名为color的指令,指向一个配置对象
// color:{
// //为绑定到的HTML元素设置红色的文字
// bind(el,binding){
// // 形参中的el是绑定了此指令的,原生的DOM对象
// el.style.color = binding.value
// },
// // 每次 DOM 更新时被调用
// update(el,binding){
// el.style.color = binding.value
// }
// }
color(el,binding){
el.style.color = binding.value
}
}
//在main.js中声明
//参数1:字符串,表示全局自定义指令的名字
//参数2:对象,用来接受指令的参数值
Vue.directive('color',function(el,binding){
el.style.color = binding.value
})
vue create demo-2
//ESLint插件配置
"editor.codeActionsOnSave": {
"source.fixAll": true
},
"eslint.alwaysShowStatus": true,
"prettier.trailingComma": "none",
"prettier.semi": false,
//每行文字个数超出此限制将会被换行
"prettier.printWidth": 300,
//使用单引号替换双引号
"prettier.singleQuote": true,
"prettier.arrowParens": "avoid",
//设置.vue文件中,HTML代码的格式化插件
"vetur.format.defaultFormatter.html": "js-beautify-html",
//忽略项目的警告弹窗
"vetur.ignoreProjectWarning": true,
"vetur.format.defaultFormatterOptions": {
"prettier": {
"trailingComma":"none",
"semi":false,
"singleQuote":true,
"arrowParens":"avoid",
"printWidth": 300
},
"js-beautify-html": {
"wrap_attributes": "false"
}
},
//项目目录下执行安装命令
npm i axios -S
//第一步: 引入axios
import axios from 'axios'
//第二步: 全局配置 axios 的请求根路径
axios.defaults.baseURL = 'http://www.liulongbin.top:3006'
//第三步: 把axios 挂载到 Vue.prototype 上,供每个.vue组件的实例直接使用
// $http : 这个可以自定义,但是一般建议为 $http
Vue.prototype.$http = axios
// 方法区
methods: {
async getInfo () {
// 使用当前vue实例:this调用全局配置的 $http 发送get请求,省略已经配置过的公共url
const { data: res } = await this.$http.get('/api/get')
console.log(res)
}
}