Day_06 Vue学习

1.自定义指令

1.1函数式

  1. 指令与元素成功绑定时(一上来)
  2. 指令所在的模板被重新解析时
<body>
    <div id="root">
        <h2>当前的n值是:
            <span v-text="n"></span>
        </h2>
        <h2>放大10倍后的n值是:
            <span v-big="n"></span>
        </h2>
        <button @click="n++">点我n+1</button>
    </div>
</body>
<script>
    new Vue({
        el: '#root',
        data: {
            n: 1,
        },
        directives: {
            // a是真实dom
            big(element, binding) {
                element.innerText = binding.value * 10;
            }
        }
    })
</script>
全局函数式指令
Vue.directive('fbind', function(element, binding) {
    element.innerText = binding.value * 10;
})

1.2对象式

<body>
    <div id="root">
        <h2>当前的n值是:
            <span v-text="n"></span>
        </h2>
        <h2>放大10倍后的n值是:
            <span v-big="n"></span>
        </h2>
        <button @click="n++">点我n+1</button>
        <hr>
        <!-- autofocus是自动获取焦点 -->
        <input type="text" v-fbind:value="n" autofocus>
    </div>
</body>
<script>
    new Vue({
        el: '#root',
        data: {
            n: 1,
        },
        directives: {
            //这个函数其实就是调用了bind和update
            // a是真实dom
            big(element, binding) {
                element.innerText = binding.value * 10;
            },
            fbind: {
                //往往bind和update都时一样的
                //指令与元素成功绑定时(一上来)
                bind(element, binding) {
                    element.value = binding.value;
                },
                //指令所在元素被插入页面时
                instered(element, binding) {
                    element.focus();
                },
                //指令所在的模板被重新解析时
                update(element, binding) {
                    element.value = binding.value;
                }
            }
        }
    })
</script>
指令的注意事项

当多个单词组成指令名称时,不能使用小驼峰命名,应该使用-连接

js应如下格式写:

//完整写法
'big-number': function(element, binding) {
                element.innerText = binding.value * 10;
            },
//简写形式
'big-number' (element, binding) {
                element.innerText = binding.value * 10;
            },
全局对象式指令
 Vue.directive('fbind', {
     bind(element, binding) {
         element.value = binding.value;
     },
     //指令所在元素被插入页面时
     instered(element, binding) {
        element.focus();
     },
     //指令所在的模板被重新解析时
     update(element, binding) {
         element.value = binding.value;
      }
  })

指令里的this全都是 window

配置对象中常用的3个回调:

(1).bind:指令与元素成功绑定时调用。
(2).inserted:指令所在元素被插入页面时调用。
(3).update:指令所在模板结构被重新解析时调用。

备注:
1.指令定义时不加v-,但使用时要加v-
2.指令名如果是多个单词,要使用kebal-case命名,不要用camelCase命名

2.Vue生命周期:

  1. 又名:生命周期回调函数、生命周期函数、 生命周期钩子。
  2. 是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数。
  3. 生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。
  4. 生命周期函数中的this指向是vm 或 组件实例对象。

数据监测、以及数据代理 创建、挂载、更新、销毁

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZUt1sXwC-1643189596020)(index_files/30676843-239a-4576-89fc-84fecf861b25.png)]

常用的生命周期钩子:
  1. mounted:发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。
  2. beforeDestroy:清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。

当使用template来作为元素渲染的时候:必须加一个根节点
在这里插入图片描述

练习如下:

<body>
    <div id="root">
        <h2 v-text="n"></h2>
        <h2>当前的n值是:{{n}}}</h2>
        <button @click="add">点我n+1</button>
        <button @click="bye">点我销毁vm</button>
    </div>
</body>

<script>
    new Vue({
        el: '#root',//可以使用vm.$mount(el)
        template: `
        <div>
            <h2>当前的n值是:{{n}}</h2>
            <button @click="add">点我n+1</button>
        </div>`,
        data: {
            n: 1
        },
        methods: {
            add() {
                this.n++;
            },
            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('beforeDestroy')
        },
        destroyed() {
            console.log('destroyed')
        },
    })
</script>

对于vue销毁的练习

<body>
    <div id="root">
        <h2 :style="{opacity}">欢迎学习Vue</h2>
        <button style="opacity=1">透明度设置为1</button>
        <button @click="stop">点我停止变换</button>
    </div>
</body>

<script>
    new Vue({
        el: '#root',
        data: {
            opacity: 1,
            a: false
        },
        methods: {
            stop() {
                this.$destroy();
            }
        },
        mounted() {
            console.log("motend", this)
                //自己追加属性
            this.timer = setInterval(() => {
                this.opacity -= 0.01;
                if (this.opacity <= 0) {
                    this.opacity = 1
                }
 
           }, 16)
        },
        beforeDestroy() {
            clearInterval(this.timer);
        },
    })
</script>
关于销毁Vue实例
  1. 销毁后借助Vue开发者工具看不到任何信息。
  2. 销毁后自定义事件会失效,但原生DOM事件依然有效。
  3. 一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值