Vue2学习之路 · 五:内置指令、自定义指令、生命周期

101 阅读4分钟

内置指令

v-bind :单向数据绑定,解析表达式,可以简写为 :xxx

v-model :双向数据绑定

v-for :遍历数组、对象、字符串

v-on :绑定事件,可以简写为@xxx

v-if :条件渲染(动态控制节点是否应该存在)

v-else :条件渲染(动态控制节点是否应该存在)

v-else-if :条件渲染(动态控制节点是否应该存在)

v-show :条件渲染(动态控制节点是否展示)

v-text :向它所在的节点中渲染文本内容,不会解析html标签,注意会替换掉其节点中所有文本,而{{xx}}则不会

v-html :向指定的节点中渲染包含HTML结构的内容,可以识别html结构,注意会替换掉其节点中所有文本,而{{xx}}则不会,v-html又安全性问题,容易导致xss攻击,所以永远不要用在用户提交的内容上,如果要用,就要用在一定可信的内容上

v-cloak :没有值,本质上是一个特殊属性,Vue实例创建完毕并接管容器后,会删除v-cloak属性,使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题

v-once :可以让所在节点在初次动态渲染后,就视为静态内容,以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能

v-pre :可以跳过所在节点的编译过程,如跳过没有使用指令语法、没有使用插值语法的节点,会加快编译速度

自定义指令

定义

局部指令

new Vue({

directives:{指令名:配置对象/回调函数}

})

全局指令

Vue.directives('指令名',回调函数)

配置对象中常见的三个回调

bind:指令与元素成功绑定时调用

inserted:指令所在的元素被插入到页面中

update:指令所在模板结构被重新解析时调用

注意

在定义指令的时候不加v-,使用的时候才加

指令名如果是多个单词,就要在单词间加 - ,,不要使用驼峰命名法

<div id="root">
        <h2>当前n的值是:<span v-text="n"></span> </h2>
        <h2>方大十倍后n的值是:<span v-big="n"></span> </h2>
        <button @click="n++">点我n+1</button>
        <hr>
        <input type="text" v-fbind:value="n">
    </div>
    <script>
        new Vue({
            el:'#root',
            data:{
                n:1
            },
            // 设置自定义指令,需要使用这个配置属性,这是局部指令,只能在这个模板中使用
            directives:{
                // 第一个参数会获取到这个指令绑定的元素
                // 第二个参数是当前自定义指令所绑定的标签的对象
                // big函数的调用
                // 当指令与元素成功绑定时,一上来就调用一次
                // 当指令所在的模板被重新解析时,也会调用这个指令
                big(element,binding){
                    element.innerHTML = binding.value*10
                },
                fbind:{
                    // 指令与元素成功绑定时(一上来)执行bind函数
                    bind(element,binding){
                        element.value = binding.value*12
                    },
                    // 指令所在元素被插入到页面中时调用inserted函数
                    inserted(element,binding){
                        element.value = binding.value
                        element.focus()
                    },
                    // 指令所在的模板被重新解析时带哦用update函数
                    update(element,binding){
                        element.value = binding.value
                    }
                }
            }
        })
        // 这是一个全局指令
        Vue.directives('big',function(element,binding){
            element.innerHTML = binding.value*10
        })
    </script>

生命周期

生命周期又名生命周期回调函数、生命周期函数、生命周期钩子

生命周期就是Vue在关键的时候调用一些有特殊名称的函数

生命周期函数的名字不能更改,但函数的具体内容是由程序员根据需求来定的

生命周期函数中的this指向的是vm或组件实例对象

vm的一生

创建之前:调用beforeCreate函数

创建完毕:调用Created函数

挂载之前:调用beforeMount函数

挂载完毕:调用mounted函数

更新之前:调用beforeUpdate函数

更新完毕:调用updated函数

销毁之前:调用beforeDestory函数

销毁完毕:调用destoryed函数

常用的生命周期钩子

mounted:发送ajax请求、启动定时器、档期自定义事件、订阅消息等初始化操作

beforeDestory:清除定时器、解绑自定义事件、取消订阅消息等收尾工作

关于销毁Vue实例

销毁后借助Vue开发者工具看不到任何消息

销毁后自定义事件会失效,但是原生DOM事件依然有效

一般不会再beforeDestory函数中操作数据,因为即使是操作数据也不会再触发更新流程了

<div id="root">
        <h2 :style="{opacity:opacity}">欢迎学习Vue</h2>
        <button @click="stop">点我停止变换</button>
        <button @click="opacity=1">透明度设置为1</button>
    </div>
    <script>
        new Vue({
            el:'#root',
            data:{
                opacity:1
            },
            methods:{
                stop(){
                    // clearInterval(this.timer);
                    this.$destroy();
                }
            },
            // Vue完成模板的解析后,并且把初始的真实DOM元素放入页面后(挂载完毕),调用mouted函数
            mounted(){
                this.timer = setInterval(() =>{
                    this.opacity -= 0.01
                    if(this.opacity <= 0){
                        this.opacity = 1
                    }},16)
            },
            beforeDestroy() {
                console.log('vm就要没了');
                clearInterval(this.timer);
            },
        })
    </script>
<div id="root">
        <h2>当前n的值为:{{n}}</h2>
        <button @click="add">点我n+1</button>
        <button @click="bye">点我销毁vm</button>
    </div>
    <script>
        new Vue({
            el:'#root',
            data:{
                n:1
            },
            methods:{
                add(){
                    this.n++;
                },
                bye(){
                    console.log('bye');
                    this.$destroy();
                }
            },
            beforeCreate() {
                console.log('beforeCreate');
            },
            created(){
                console.log('created');
            },
            beforeMount() {
                console.log('beforeMount');
            },
            mounted() {
                console.log('mounted');
            },
            beforeUpdate() {
                console.log('beforeUpdate');
            },
            updated() {
                console.log('updated');
            },
            beforeDestroy() {
                console.log('beforeDestory');
            },
            destroyed() {
                console.log('destoryed');
            },
            
        })
    </script>