文章目录
- 十四、内置指令
- v-text
- v-html
- v-cloak(没有值)
- v-once
- v-pre
- 自定义指令
- 一、定义语法
- 二、配置对象中常用的3个问题
- 三、备注
 
 
 
十四、内置指令
回顾:
 v-bind :单向绑定解析表达式,可简写为 :xxx
 v-model : 双向数据绑定
 v-for :遍历数组/对象/字符串
 v-on :绑定事件监听,可简写为@
 v-if :条件渲染(动态控制节点是否存在)
 v-else :条件渲染(动态控制节点是否存在)
 v-show :条件渲染(动态控制节点是否展示)
v-text
- 作用向其所在的节点中渲染文本内容
- 与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会
 v-html:向指定节点中渲染包含html结构的内容
 v-text
- 作用向其所在的节点中渲染文本内容
- 与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会
<body>
  <div id="root">
    <div>你好,{{name}}</div>
    <div v-text="name">你好,</div>
  </div>
</body>
<script type="text/javascript">
  Vue.config.productionTip = false;
  new Vue({
    el: '#root',
    data: {
      name: 'mq'
    }
  })
</script>

v-html
- 作用:向指定节点中渲染包含html结构的内容
- 与插值语法的区别:
 a. v-html会替换掉节点中所有的内容,{{xx}}则不会
 b. v-html可以识别html结构
- 严重注意:v-hmtl有安全性问题
 a. 在网站上动态渲染任意HTML是非常危险的。容易导致xxs攻击
 b. 一定要在可信的内容上使用v-html,永不要在用户提交的内容上
<body>
  <div id="root">
    <div>你好,{{name}}</div>
    <div v-text="name">你好,</div>
    <div v-html="str"></div>
  </div>
</body>
<script type="text/javascript">
  Vue.config.productionTip = false;
  new Vue({
    el: '#root',
    data: {
      name: 'mq',
      str: '<span style="color:red">我是span标签</span>'
    }
  })
</script>
v-cloak(没有值)
- 本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性
- 使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题
<style>
    [v-cloak]{
        display: none;
    }
</style>
<body>
  <div id="root">
    <div v-cloak>你好,{{name}}</div>
  </div>
</body>
<script type="text/javascript">
  Vue.config.productionTip = false;
  new Vue({
    el: '#root',
    data: {
      name: 'mq'
    }
  })
</script>
v-once
- v-once所在节点在初次动态渲染后,就视为静态内容了
- 以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能
<body>
  <div id="root">
    <h2 v-once>初始化的n值是:{{n}}</h2>
    <h2>当前的n值是:{{n}}</h2>
    <button @click="n++">点我n+1</button>
  </div>
</body>
<script type="text/javascript">
  Vue.config.productionTip = false;
  new Vue({
    el: '#root',
    data: {
      n: 1
    }
  })
</script>
v-pre
- 跳过其所在节点的编译过程
- 可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译
<div id="root">
  <h2 v-pre>Vue好难</h2>
  <h2>当前的n值是:{{n}}</h2>
  <button @click="n++">点我n+1</button>
</div>
自定义指令
一、定义语法
- 局部指令
 new Vue({
 directives:{ 指令名:配置对象 }
 })
 new Vue({
 directives(){指令名:回调函数}
 })
- 全局指令
 Vue.directive(指令名,配置对象) 或 Vue.directive(指令名,回调函数)
二、配置对象中常用的3个问题
- bind:指令与元素成功绑定时调用
- inserted:指令所在元素被插入页面时调用
- update:指令所在模版结构被重新解析是调用
三、备注
- 指令定义时不加v-,但使用时要加
- 指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名
<body>
  <!-- 需求1:定义一个v-big 指令,让被绑定的元素数值放大十倍
  需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点 -->
  <div id="root">
    <h2>当前n值是:<span v-text="n"></span></h2>
    <h2>放大十倍后的值是:<span v-big="n"></span></h2>
    <!-- <h2>放大十倍后的值是:<span v-big-number="n"></span></h2> -->
    <button @click="n++">点我n+1</button>
    <hr>
    <input type="text" v-fbind.value="n">
  </div>
</body>
<script type="text/javascript">
  Vue.config.productionTip = false;
  new Vue({
    el: '#root',
    data: {
      n: 1
    },
    directives: {
      // big函数什么时候会被调用:1.指令绑定的时候(一开始),2.指令所在模板被重新解析的时候
      big(element,binding){
        element.innerText = binding.value * 10
      },
      // 'big-number'(element, binding) {
      //     element.innerText = binding.value * 10
      // },
      fbind:{
        // 指令与元素成功绑定时(一上来)
        bind(element,binding){
          element.value = binding.value
        },
        // 指令所在元素被插入页面时
        inserted(element, binding){
          element.focus()
        },
        // 指令所在模板被重新解析时
        update(element, binding){
          element.value = binding.value
        }
      }
    }
  })
</script>



















