四时宝库

程序员的知识宝库

VUE教程-(五)指令(vue指令及用法)

5.1 内置指令

v-bind:单项绑定

v-model:双向绑定

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

v-on:绑定事件监听,可简写为@

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

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

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

v-text:

向其所在的节点中渲染文本内容。
与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。
与v-html的区别:v-text不支持标签解析

<div id="root">
    <div>你好,{{name}}</div>
    <div v-text="name"></div>
    <div v-text="str"></div>
</div>

<script type="text/javascript">
    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

    new Vue({
        el:'#root',
        data:{
            name:'张三',
            str:'<h3>你好啊!</h3>'
        }
    })
</script>

v-html

v-html有安全性问题!!!!
1. 在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。
2. 一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!

v-cloak

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

<style>
    [v-cloak]{
        display:none;
    }
</style>

<div id="root">
    <h2 v-cloak>{{name}}</h2>
</div>
<script type="text/javascript" src="http://localhost:8080/resource/5s/vue.js"></script>

<script type="text/javascript">
    console.log(1)
    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

    new Vue({
        el:'#root',
        data:{
            name:'尚硅谷'
        }
    })
</script>

v-once

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

<div id="root">
        <h2 v-once>初始化的n值:{{n}}</h2>
        <h2>当前的n:{{n}}</h2>
        <button @click="n++">点我n+1</button>
    </div>

    <script>
        // 创建 vm 实例对象
        const vm = new Vue({
            el: '#root',
            data: {
                n: 1
            },
            methods: {}
        });
    </script>

v-pre

跳过其所在节点的编译过程
可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译


5.2 自定义指令

引入:

一个小demo

<button id="btn">点我创建一个输入框</button>
    <script>
        const btn = document.getElementById('btn')
        btn.onclick = () => { 
            const input = document.createElement('input')
            document.body.appendChild(input)
            // 文本框出现的时候自动获取焦点
            input.focus()  //执行的时机问题
        }
</script>

需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。

需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。

不同的时刻调用不同的函数

<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>

        <input type="text" v-fbind:value="n">
</div>

<script>
        // 创建 vm 实例对象
        const vm = new Vue({
            el: '#root',
            data: {
                n: 1
            },
            directives: {
                // big函数什么时候会被调用
                // 1.指令与元素成功绑定时(一上来)
                // 2.指令所在的模板发生解析时

                //element指的是span
                big(element, binding) {
                    // console.log(element, binding.value)
                    element.innerText = binding.value * 10
                },
                //element指的是input
                fbind: {
                    // 指令与元素成功绑定(一上来)
                    bind(element, binding) {
                        // console.log('bind')
                        element.value = binding.value
                    },
                    // 指令所在元素被插入页面时
                    inserted(element, binding) {
                        // console.log('inserted')
                        element.focus()
                    },
                    // 指令所在的模板发生解析时
                    update(element, binding) {
                        // console.log('update')
                        element.value = binding.value
                    }
                }
            }
        });
</script>

总结:

指令名一定要加引号,短横线

此处的this指向window

这里的big和fbind都是局部指令

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接