初学Vue(3)(内置指令)

时间:2024-10-14 07:48:23

文章目录

    • 十四、内置指令
      • 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

  1. 作用向其所在的节点中渲染文本内容
  2. 与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会
    v-html:向指定节点中渲染包含html结构的内容
    v-text
  3. 作用向其所在的节点中渲染文本内容
  4. 与插值语法的区别: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

  1. 作用:向指定节点中渲染包含html结构的内容
  2. 与插值语法的区别:
    a. v-html会替换掉节点中所有的内容,{{xx}}则不会
    b. v-html可以识别html结构
  3. 严重注意: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(没有值)

  1. 本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性
  2. 使用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

  1. v-once所在节点在初次动态渲染后,就视为静态内容了
  2. 以后数据的改变不会引起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

  1. 跳过其所在节点的编译过程
  2. 可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译
<div id="root">
  <h2 v-pre>Vue好难</h2>
  <h2>当前的n值是:{{n}}</h2>
  <button @click="n++">点我n+1</button>
</div>

自定义指令

一、定义语法
  1. 局部指令
    new Vue({
    directives:{ 指令名:配置对象 }
    })
    new Vue({
    directives(){指令名:回调函数}
    })
  2. 全局指令
    Vue.directive(指令名,配置对象) 或 Vue.directive(指令名,回调函数)
二、配置对象中常用的3个问题
  1. bind:指令与元素成功绑定时调用
  2. inserted:指令所在元素被插入页面时调用
  3. update:指令所在模版结构被重新解析是调用
三、备注
  1. 指令定义时不加v-,但使用时要加
  2. 指令名如果是多个单词,要使用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>