赞
踩
插值语法:
功能:用于解析标签体内容(如<div>标签体</div>
)
语法:{{xxx}}
,xxx会作为js表达式解析
指令语法:
功能:解析标签属性、解析标签体内容、绑定事件
举例:v-bind:href=‘xxxx’,xxxx会作为js表达式被解析(v-bind绑定标签属性的内容,v-bind可简写为 :
)
Vue中有有很多的指令,此处只是用v-bind举个例子
vue对象绑定和data的两种写法:
第一种:
<div id="root"></div>
<script type="text/javascript">
new Vue({
el:'#root'; <!--进行绑定-->
data:{} <!--对象式-->
})
</script>
第二种:
<div id="root">
</div>
<script type="text/javascript">
const v=new Vue({
data:function(){ <!--函数时,也可以简写为data(){return{}}-->
return{}
}
})
v.$mount('#root') <!--进行绑定-->
</script>
单向数据绑定:
使用v-bind
进行数据绑定。
特点:数据只能从data流向页面,在页面上进行的数据改变不会使data里的数据发生变化。
语法v-mode:value="xxx"
或简写为v-model="xxx"
;但v-model
只能应用在表单类元素(输入类元素)上,因为v-model
默认收集的就是value值。
特点:数据不仅能从data流向页面,还能从页面流向data。
Model
和 View
,是 Model
和 View
之间的桥梁。每当V层获取或者保存数据的时候,都要由VM
层做中间的处理,从而交给M层。vm身上所有的属性及vue原型上所有属性,在Vue模板中都可以直接使用
Object.defineProperty方法
<script type="text/javascript"> let number=18 let person={ name:'张三', sex:'男' } Object.defineProperty(person,'age',{//向person对象中设置age属性 //value:number, enumerable:true,//控制属性是否可以枚举 writable:true,//控制属性是否可以被修改 configurable:true,//控制属性是否可以被删除 get(){//当读取person的age属性时,get函数就会被调用,且返回值就是age的值 return number; } set(value){ number=value } }) </script>
数据代理
vm会对data里的数据进行数据代理。vm中也有data中的属性,但与data是不一样的,就是进行了数据代理(其中还添加了监视数据的功能),将data中的数据进行代理然后再通过get方法传给 vm 中的属性
要显示的数据不存在,要通过计算得来。为了简化在DOM中的操作,在 computed 对象中定义计算属性。
computed对象 比 methods 的好处是增加了缓存机制,且可直接使用类似属性名的方式使用
<div id="root"> <input type="text" v-model="data1"> <input type="text" v-model="data2"> {{data3}}<!--调用属性--> </div> <script type="text/javascript"> const v=new Vue({ data:{ data1:1 data1:2 }, computed:{ data3:{//就是defineProperty的机制,data3还是个属性 get(){ return this.data1+this.data2 }, set(value){...} } } //简写方式:直接写成data3(){}代替get()【在不使用set的情况下】 }) v.$mount('#root') <!--进行绑定--> </script>
如需引用本地的图片或者视频,需要加上require
{url:require("../static/video/video.mp4")}
事件的基本使用:
<div id="root">
<button @click="showInfo($event,arg)">点击</button>
</div>
<script type="text/javascript">
const v=new Vue({
data:{},
methods:{//所有的方法都放在这
showInfo(event,arg){
<!--事件处理-->
}
}
})
v.$mount('#root') <!--进行绑定-->
</script>
使用v-on:xxx
或@xxx
绑定事件,其中 xxx 为事件名。
例如 点击事件v-on:click="方法名"
(方法用于处理事件)
showInfo($event,arg)
:在方法名后的括号里可以进行传参,为了避免event
丢失,最好手动添加一个$event
。
vue中的事件修饰符:(如@click.xxx
)
.prevent
:阻止默认事件(比如点击一个链接的默认事件为跳转页面).stop
:阻止事件冒泡.once
:事件只触发一次(方法中执行的事件).self
:只有event.target
是当前操作的元素时才触发事件。(如发生事件冒泡时,event.target不会随着事件冒泡而发生改变。).passive
:事件的默认行为立即执行,无需等待事件回调执行完毕(比如方法中的执行)。键盘事件(@keydown.xxx,@keyup.xxx
):
Vue中常用的按键别名:
回车 => enter
删除 => delete (捕获“删除”和“退格”键)
退出 => esc
空格 => space
换行 => tab (特殊,必须配合keydown去使用)
上 => up
下 => down
左 => left
右 => right
系统修饰键(用法特殊):ctrl、alt、shift、meta
(1).配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发。
(2).配合keydown使用:正常触发事件。
按键修饰符:
keycode : 操作的是某个 keycode 值的键
keyName : 操作的某个按键名的键(少部分
状态改变事件(@change)
通过vm对象的$watch()或watch配置来监视指定的属性。当属性变化时,回调函数自动调用,在函数内部进行计算。
new Vue({
....
watch:{
被监视的属性名:{
handler(newValue,oldValue){/*处理事务*/}
}
}
})
//另一种写法
vm.$watch('属性名',{handler(newValue,oldValue){/*处理事务*/}})
如果被监视属性为一个对象,则需使用'对象.属性'
如果对象中存在多个层级(默认不监视内部属性值的改变),则需要开启深度监视 deep:true
两个小原则:
class绑定:
<style> .style1{...} .style2{...} ........ </style> <div id="root"> <div class="basic" :class="str" @click="action1"></div><!--@click为触发事件,也可以为其他的事件--> <div class="bassic" :class="arr" @click="action2"></div> <div class="bassic" :class="obj" @click="action2"></div> </div> <script type="text/javascript"> const vm=new Vue({ el:'#root', data:{ //将class值转换为Vue里的属性值,通过触发事件可以动态的改变样式 str:'style1,style2...',//字符串法绑定 arr:['style1','style2']//数组法绑定,用于样式类名不确定,且数量不确定的方式 obj:{ //对象绑定法 style1:false, style2:true } } //可以通过在methods中通过事件动态改变样式 }) </script>
style绑定:
<div id="root"> <!-- 绑定style样式--对象写法 --> <div class="basic" :style="styleObj">{{name}}</div> <br/><br/> <!-- 绑定style样式--数组写法 --> <div class="basic" :style="styleArr">{{name}}</div> </div> <script type="text/javascript"> const vm = new Vue({ el:'#root', data:{ name:'尚硅谷', mood:'normal', styleObj:{ fontSize: '40px', }, styleArr:[ { fontSize: '40px', color:'blue', }, { backgroundColor:'gray' } ] } </script>
v-show:
<h2 v-show="false">hello</h2><!--当v-show值为false时,该标签将会被隐藏起来,为true则会显现-->
v-if和 v-else-if
v-if
与v-show
不同的是,v-if
的值为false时直接将标签元素删除。
v-if
可以和v-else-if
、v-else
一起使用,但要求结构不能被打断。
使用<template v-if>
可以包裹元素,且不会影响页面结构。(在渲染时<template>会自动去掉)
如果需要频繁切换 v-show 较好
v-for指令:
用于展示列表数据
<div id="root"> <h2>人员列表(遍历数组)</h2> <ul> <li v-for="(p,index) of persons" :key="index"> {{p.name}}-{{p.age}} </li> </ul> <h2>汽车信息(遍历对象)</h2> <ul> <li v-for="(value,k) of car" :key="k"> {{k}}-{{value}}<!--key-value键值对--> </li> </ul> <h2>测试遍历指定次数(用得少)</h2> <ul> <li v-for="(number,index) of 5" :key="index"> {{index}}-{{number}} </li> </ul> </div> <script type="text/javascript"> Vue.config.productionTip = false new Vue({ el:'#root', data:{ persons:[ {id:'001',name:'张三',age:18}, {id:'002',name:'李四',age:19}, {id:'003',name:'王五',age:20} ], car:{ name:'奥迪A8', price:'70万', color:'黑色' } } }) </script>
key的作用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zm2x3G0F-1684223486801)(D:\学习图片资料\Vue\虚拟dom中的key.png)]
在列表中,虚拟dom的对比是根据key值来进行的(默认为下标索引)
对比规则:
(1).旧虚拟DOM中找到了与新虚拟DOM相同的key:
①.若虚拟DOM中内容没变, 直接使用之前的真实DOM!
②.若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOM。
(2).旧虚拟DOM中未找到与新虚拟DOM相同的key
创建新的真实DOM,随后渲染到到页面。
开发中如何选择key?:
1.最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。
2.如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示,使用index作为key是没有问题的。
Vue监视数据的原理: 1. vue会监视data中所有层次的数据。 2. 如何监测对象中的数据? 通过setter实现监视,且要在new Vue时就传入要监测的数据属性(生成一个新的data(数据代理),为属性添加get和set,其中含有监听机制)。 (1)对象中后追加的属性,Vue默认不做响应式处理 (2)如需给后添加的属性做响应式,请使用如下API: Vue.set(target,propertyName/index,value) 或 vm.$set(target,propertyName/index,value) (target为包含要修改的属性的对象或数组,propertyName为要修改或添加的属性,value为值) 3. 如何监测数组中的数据? 通过包裹数组更新元素的方法实现,本质就是做了两件事: (1).调用原生对应的方法对数组进行更新。(pop、push、shift...) (2).重新解析模板,进而更新页面。(增加监听机制,使能够响应给前端页面) 4.在Vue修改数组中的某个元素一定要用如下方法: 1.使用这些API:push()、pop()、shift()、unshift()、splice()、sort()、reverse() 2.Vue.set() 或 vm.$set() 特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象 添加属性!!!(即target不能是vm.data之类的)
收集表单数据:
若:<input type="text"/>,则v-model收集的是value值,用户输入的就是value值。
若:<input type="radio"/>,则v-model收集的是value值,且要给标签配置value值。
若:<input type="checkbox"/>
1.没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值)
(配置value值:<input type="checkbox" v-model="xxx" value="xxx">)
2.配置input的value属性:
(1)v-model中的"xxx"的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)
(2)v-model中的"xxx"的初始值是数组,那么收集的的就是value组成的数组
备注:v-model的三个修饰符:
.lazy:失去焦点再收集数据
.number:输入字符串转为有效的数字(搭配<input type="number"/>使用,其功能为只能输入数字)
.trim:输入首尾空格过滤
/**过滤器: 定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理,较为复杂的操作还是使用computed和methods)。 备注: 1.过滤器也可以接收额外参数、多个过滤器也可以串联 2.并没有改变原本的数据, 是产生新的对应的数据 **/ //1、注册过滤器: //全局过滤器 Vue.filter('过滤器名',function(value){ return value }) //局部过滤器 new Vue{ filters:{ filterName(value){ return value } } } //2、使用过滤器:{{ xxx | 过滤器名}} 或 v-bind:属性 = "xxx | 过滤器名 |过滤器名"(会默认将xxx的值传入到过滤器,如果还传递其他的参数不会将其覆盖) //多个过滤器串联,形成一个过滤链。
v-text
v-html
作用:向指定节点中渲染包含html结构的内容(即v-html可以识别html结构)
<div v-html="str"></div>
<!--str:'<h3>你好啊!</h3>'
输出为:'你好啊!'
-->
严重注意:v-html有安全性问题!!!!
(1).在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。(容易被别人通过标签中的js代码获取信息)
(2).一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!
v-cloak
本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。
使用css配合使用,解决网速慢时页面展示出未经Vue解析的模板。
<style>
[v-cloak]{
display:none;
}
</style>
v-once
v-once所在节点中的数据在初次动态渲染后,就视为静态内容了。
<h2 v-once>
初始化的n值是:{{n}}
</h2>
<!--如果设置个点击事件,且n的初始为1,则在第一次后就不会再显示后续n改变的值。就相当于将n中的值变为一个常数,但不是把n变为一个常数-->
以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。
v-pre
自定义指令: 一、定义语法: (1).局部指令: new Vue({ new Vue({ directives:{指令名:配置对象} 或 directives:{指令名:回调函数} }) }) (2).全局指令: Vue.directive(指令名,配置对象) 或 Vue.directive(指令名,回调函数) 注意:在directives内的this不再是vm对象,而是windows 二、配置对象中常用的3个回调函数: (vue的执行流程为:先与模板<div>中的指令进行绑定,然后在插入页面。当模板中数据或结构发送变化时会重新解析模板) (1)bind(element,binding):指令与元素成功绑定时调用。 (2)inserted(element,binding):指令所在元素被插入页面时调用。 (3)update(element,binding):指令所在模板结构被重新解析时调用。 (element为与指令绑定的dom元素,binding为html元素内 v-指令=""中的值) 三、备注: 1.指令定义时不加v-,但使用时要加v-; 2.指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名。
生命周期:
1.又名:生命周期回调函数、生命周期函数、生命周期钩子。
2.是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数。
3.生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。
4.生命周期函数中的this指向是vm 或 组件实例对象。
mounted()周期函数
new Vue({
//Vue完成模板的解析并把初始的真实DOM元素放入页面后(挂载完毕)调用mounted
mounted(){
...
}
})
beforeDestroy:
清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】
beforeDestroy
及以后就不会再进行对数据的监视和更新了。所以一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程。Vue中使用组件的三大步骤:
一、定义组件(创建组件)
二、注册组件
三、使用组件(写组件标签)
定义组件
//例如创建school组件 //组件实例中不配置 el项 //template:模板,该组件所用到的html代码使用 `` 包裹起来。html元素中必须使用<div>括起来 //data只能使用函数式返回对象数据。因为这样的数据对象不再是单例的 const school = Vue.extend({ template:` <div class="demo"> <h2>学校名称:{{schoolName}}</h2> <h2>学校地址:{{address}}</h2> <button @click="showName">点我提示学校名</button> </div> `, data(){ return { schoolName:'尚硅谷', address:'北京昌平' } } }) //精简的写法去掉Vue.extend,直接定义成一个对象。在component中会自行判断调用Vue.extend。
注册组件
//1.局部注册:靠new Vue的时候传入components选项
new Vue({
el:'#root',
components:{
school //是school:school 的简写
}
})
//2.全局注册:靠Vue.component('组件名',组件)
Vue.component('school',school)
使用组件
<div id="root">
<!-- 第三步:编写组件标签-->
<school></school>
</div>
嵌套组件
组件中也存在 component
对象,将一个组件注册到另一个组件中,就实现了嵌套,然后在组件的 template
中使用注册的组件对应的html标签元素就可以了。
关于VueComponent
1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。
2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,
即Vue帮我们执行的:new VueComponent(options)。
3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!
4.关于this指向:
(1)组件配置中:
data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例象】。
(2)new Vue(options)配置中:
data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。
5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。
Vue的实例对象,以后简称vm。
创建一个.vue文件(component组件)
//School.vue
<template><!--存放html--></template>
<script>
//组件交互相关的代码
export default{ //向外暴露接口,以便html引用
name:'School',
data(){}
}
</script>
<style>/*组件的样式*/</style>
创建App.vue(汇总所有的组件)
<template> <div> <School></School> </div> </template> <script> //引入组件 import School from './School.vue' export default { name:'App', components:{ School } } </script>
创建main.js(创建vue实例)
import App from './App.vue'
new Vue({
el:'#root',
template:`<App></App>`,
components:{App},
})
然后在html中引用。但是浏览器不支持import
,所以上述要在脚手架中支持运行。
脚手架中引入的vue并不是完整版的vue。
关于不同版本的Vue:
1.vue.js与vue.runtime.xxx.js的区别:
(1).vue.js是完整版的Vue,包含:核心功能+模板解析器。
(2).vue.runtime.xxx.js是运行版的Vue,只包含:核心功能;没有模板解析器。
2.因为vue.runtime.xxx.js没有模板解析器,所以不能使用template配置项,需要使用
render函数接收到的createElement函数去指定具体内容。
<h1 ref="xxx"></h1>
或<School ref="xxx"></School>
this.$refs.xxx
功能:让组件接收外部传过来的数据
向组件传递数据:<Demo name="xxx"/>
(组件标签,默认传入的值为字符串,可以用v-bind绑定成JS表达式,转换为数值型)
传送的数据也可以是对象和方法,对于方法传递过去调用时还是在属于原来定义它的组件中执行。(数据在哪,对数据的操作就在哪,然后任由其他组件调用)
声明接收数据:
第一种方式(只接收):props:['name']
第二种方式(限制类型):props:{name:String}
第三种方式(限制类型、限制必要性、指定默认值):
props:{
name:{
type:String, //类型
required:true, //必要性
default:'老王' //默认值
//required与default一般不同时出现
}
}
备注:props是只读的,Vue底层会监测你对props的修改(只是监测地址的变化),如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中一份(属性名不能重名),然后去修改data中的数据。
props的优先级比data的高,会先在vc上配置props传来的属性
功能:可以把多个组件共用的配置提取成一个混入对象
使用方式:
第一步定义混合:重新创建一个mixin.js
文件
export const mixin1 = {
methods: {},
data:{},
mounted() {}
}
export const mixin2 = {
....
}
第二步使用混入:
全局混入:在main.js中导入
import {mixin1,mixin2} from './mixin'
Vue.mixin(mixin1)
Vue.mixin(mixin2)
局部混入:在要使用的组件中导入
import {mixin1,mixin2} from './mixin'
mixins:[mixin1,mixin2]
注意事项:
<style scoped>
安装vue-router,命令:npm i vue-router
(vue2里引入 npm install vue-router@3.2.0 -S
)
应用插件:Vue.use(VueRouter)
(一般在main.js中应用)
创建index.js配置路由项(一般在src下新建router文件夹,放入其中)
import VueRouter from 'vue-router'
import Login from "@/pages/Login";
export default new VueRouter({
routes:[
{
path:'/',
component:Login
},
]
})
在App.vue中展示
<template>
<router-view></router-view>//一个占位符,页面会在这进行展示
</template>
如果存在导航栏,也可以在导航栏项中通过链接点击进行切换,内容展示在<router-view></router-view>
中
<router-link active-class="active" to="/about">About</router-link>//在解析时会转换成a标签
pages
文件夹,一般组件通常存放在components
文件夹。$route
属性,里面存储着自己的路由信息。$router
属性获取到。配置路由规则,使用children配置项:
routes:[ { path:'/about', component:About, }, { path:'/home', component:Home, children:[ //通过children配置子级路由 { path:'news', //此处一定不要写:/news component:News }, { path:'message',//此处一定不要写:/message component:Message } ] } ]
通过链接跳转(要写完整路径)
//通过路径引用
<router-link to="/home/news">News</router-link>
作用:可以简化跳转,直接使用名称进行路由跳转
在路由对象中添加name属性
//注意,在router-link中的使用方式
<router-link :to="{name:xxxx}"></router-link>
例如点击链接,自动跳转到index页面
export default new VueRouter({ routes:[ { path: '/', //在'/'页面默认跳转到'index'页面 redirect:'index' }, { path:'/', component:Home, children:[ { name:'index', path:'index', component:()=>import('@/pages/index') } ] } ] })
传递参数
<!-- 跳转并携带query参数,to的字符串写法 -->
<router-link :to="`/home/message/detail?id=${m.id}&title=${m.title}`">跳转</router-link>
<!-- 跳转并携带query参数,to的对象写法 -->
<router-link
:to="{
path:'/home/message/detail',
query:{
id:m.id,
title:m.title
}
}"
>跳转</router-link>
<router-view></router-view><!-- 指定组件的呈现位置 -->
Detail.vue
中接收参数(在template中):例如
<template>
<ul>
<li>消息编号:{{$route.query.id}}</li>
<li>消息编号:{{$route.query.title}}</li>
</ul>
</template>
配置路由,声明接收params参数
{ path:'/home', component:Home, children:[ { component:Message, children:[ { name:'xiangqing', path:'detail/:id/:title', //使用占位符声明接收params参数 component:Detail } ] } ] }
传递参数
<!-- 跳转并携带params参数,to的字符串写法 -->
<router-link :to="/home/message/detail/${m.id}/${m.title}">跳转</router-link>
<!-- 跳转并携带params参数,to的对象写法 -->
<router-link
:to="{
name:'xiangqing',
params:{
id:666,
title:'你好'
}
}"
>跳转</router-link>
<router-view></router-view><!-- 指定组件的呈现位置 -->
特别注意:路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name配置!
接收参数如同上述
在路由中配置props
属性
<script> export default new VueRouter({ routes:[ { name:'Detail', path:'/:id/:title',//params占位,与第二种props写法搭配使用 component:Detail, //props的第一种写法,值为对象。 props:{id:1,title:'hello'} //props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传递给Detail组件,但是对于query参数无效 props:true //props的第三种写法,值为函数 props($route){ return{ id:$route.query.id, title:$route.query.title } } } ] }) </script>
传递参数
<router-link
:to="{
name:'detail',
query(或者params):{ //第三种props写法中的$route.query数据来与此
id:666,
title:'你好'
}
}"
>跳转</router-link>
<router-view></router-view><!-- 指定组件的呈现位置 -->
在组件中配置props属性接收数据
<template>
<!--可以在这通过插值语法引用传来的参数-->
</template>
<script>
export default{
name:'Login',
props:['id','title']
}
</script>
不使用<router-link>标签
,使用方法的形式。
<template> <div> <ul> <li v-for="m in messageList" :key="m.id"> <button @click="pushShow(m)">push查看</button> </li> </ul> <hr> <router-view></router-view><!-- 指定组件的呈现位置 --> </div> </template> <script> export default{ name:'Login', props:['id','title'], data() { return { messageList:[ {id:'001',title:'消息001'}, {id:'002',title:'消息002'}, {id:'003',title:'消息003'} ] } }, methods:{ pushShow(m){ this.$router.push({ name:'xiangqing',//跳转的页面 query:{ id:m.id, title:m.title } }) } } } </script>
如果路由中的组件存在类似于输入框这些的元素,不想在切换路由时将其组件销毁,则需要使用缓存。
在该组件展示所在的<router-view>
使用<keep-alive>
包裹
<keep-alive :include="['被展示组件的组件名']">//只有include中的组件才会在切换时不被销毁。
<router-view></router-view>
</keep-alive>
**激活生命周期:**当点击并显示该组件页面时,才会触发一些事务(在组件不被销毁的情况下)
activated(){
//被激活时触发的事务
}
**失活生命周期:**当切换到其他组件页面时,结束一些事务
deactivated(){
//结束事务
}
geList" :key=“m.id”>
<button @click=“pushShow(m)”>push查看
### 缓存路由组件
- 如果路由中的组件存在类似于输入框这些的元素,不想在切换路由时将其组件销毁,则需要使用缓存。
- 在该组件展示所在的`<router-view>`使用`<keep-alive>`包裹
```vue
<keep-alive :include="['被展示组件的组件名']">//只有include中的组件才会在切换时不被销毁。
<router-view></router-view>
</keep-alive>
**激活生命周期:**当点击并显示该组件页面时,才会触发一些事务(在组件不被销毁的情况下)
activated(){
//被激活时触发的事务
}
**失活生命周期:**当切换到其他组件页面时,结束一些事务
deactivated(){
//结束事务
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。