Vue—其他指令及自定义指令

目录

v-text

v-html

v-cloak

v-once

v-pre

自定义指令

局部自定义指令

函数的写法:

对象的写法:


v-text

将内容填充到标签体当中,并且是以覆盖的形式填充,而且填充的内容中即使存在HTML标签也只是会当做一个普通的字符串处理,不会解析。功能等同于原生JS中的innerText

v-html

将内容填充到标签体当中,并且是以覆盖的形式填充,而且将填充的内容当做HTML代码解析。功能等同于原生JS中的innerHTML。

v-html不要用到用户提交的内容上。可能会导致XSS攻击。

XSS攻击通常指的是通过利用网页开发时留下的漏洞 ,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript。

例如:

在 <li v-for="(item,index) of myList" v-html="item"> 中,item 是用户通过文本框输入并提交的内容。当用户输入一段包含 HTML/JavaScript 的字符串(例如 <imgsrc=x οnerrοr=alert('XSS')>)时,v-html 会将其直接渲染为 DOM 元素,其中 onerror 事件会被触发,执行 alert 等恶意代码。

v-cloak

v-cloak配合css样式来解决 {{}} 的闪现问题。

v-cloak指令使用在标签当中,当Vue实例接管之后会删除这个指令。

这是一段CSS样式:当前页面中所有带有v-cloak属性的标签都隐藏起来。

javascript 复制代码
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Vue的其它指令</title>
    <style>
      [v-cloak] {
        display: none;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <h1 v-cloak>{{msg}}</h1>
    </div>

    <script>
      //模拟:如果vue引入比较晚,在没有vue的时候,页面会出现胡子语法
      // 晚3s引入vue.js
      setTimeout(() => {
        let scriptElt = document.createElement("script");
        scriptElt.src = "./js/vue.js";
        document.head.append(scriptElt);
      }, 3000);
      // 晚4s创建vm实例
      setTimeout(() => {
        const vm = new Vue({
          el: "#app",
          data() {
            return {
              msg: "v-cloak的实现原理",
            };
          },
        });
      }, 4000);
    </script>
  </body>
</html>

v-once

只渲染一次。之后将被视为静态内容。

v-pre

使用该指令可以提高编译速度。带有该指令的标签将不会被编译。可以在没有Vue语法规则的标签中使用可以提高效率。不要将它用在带有指令语法以及插值语法的标签中。

自定义指令

局部自定义指令
函数的写法:

自定义指令,使用时,v-开始,设置自定义指令时,不需要加v-,注意多个单词用'-'连接

函数式的写法,初次绑定时bind调用,更新时update调用

javascript 复制代码
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>自定义指令</title>
    <script src="./js/vue.js"></script>
  </head>

  <body>
    <!-- vm容器 -->
    <div id="app">
      <h1>{{msg}}</h1>
      <!-- 需求1:自定义v-text-danger指令,将msg文字变红放入到div中 -->
      <h2 v-text="username"></h2>
      <div v-text-red="username"></div>
      <a href="#" v-text-red="msg"></a><br />
      <input type="text" v-model="username" />
      <hr />
      <!-- 需求2: 自定义一个指令,可以和v-bind指令完成相同的功能,同时将该元素的父级元素的背景色设置为蓝色。-->
      <div style="border: 1px solid red">
        <input type="text" v-bind-blue:value="username" />
      </div>
    </div>
    <!-- vm容器 -->
    <div id="root">
      <h2 v-text-red="msg"></h2>
    </div>
    <script>
      const vm = new Vue({
        el: "#app",
        data() {
          return {
            msg: "自定义指令",
            username: "jackson123",
          };
        },
        // 配置自定义指定
        directives: {
          // 函数式:初始化执行一次,当数据变化式,重新执行
          "text-red"(element, binding) {
            // console.log('当前绑定指令的那个标签',element);
            // console.log('是跟当前标签相关的数据对象',binding);
            element.innerHTML = binding.value;
            element.style.color = "red";
          },
          // 自定指令函数:初始化调用,数据更新时调用一次,差一个调用时机,当解析好的内容插入到页面时
          // "bind-blue"(element, binding) {
          //   // console.log(binding);
          //   element.value = binding.value;
          //   // element.parentNode.style.backgroundColor='blue'
          //   console.log(element.parentNode);

          // },
          "bind-blue": {
            // 元素与指令初次绑定的时候,自动调用bind
            bind(element, binding) {
              element.value = binding.value;
            },
            // 元素被插入到页面之后,这个函数自动被调用。
            inserted(element, binding) {
              element.parentNode.style.backgroundColor = "blue";
            },
            // 当模板重新解析的时候,这个函数会被自动调用。
            update(element, binding) {
              element.value = binding.value;
            },
          },
        },
      });
    </script>
  </body>
</html>
对象的写法:

多一个执行时机,inserted元素插入到页面之后执行

javascript 复制代码
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>自定义指令</title>
    <script src="./js/vue.js"></script>
  </head>

  <body>
    <div id="app">
      <h1>自定义全局指令</h1>
      <div v-text-red="msg"></div>

      <div>
        v-bind-blue:用户名:<input type="text" v-bind-blue:value="msg" />
      </div>
    </div>

    <hr />

    <div id="app2">
      <div v-text-red="msg"></div>
      <div>
        v-bind-blue:用户名:<input type="text" v-bind-blue:value="msg" />
      </div>
    </div>

    <script>
      // 定义全局的指令
      // 函数式 Vue.directive('指令名',回调函数)
      Vue.directive("text-red", (element, binding) => {
        element.innerHTML = binding.value;
        element.style.color = "red";
      });

      // 对象式 Vue.directive('指令名',{bind(){},inserted(){},update(){}})
      Vue.directive("bind-blue", {
        bind(element, binding) {
          element.value = binding.value;
        },
        inserted(element, binding) {
          element.parentNode.style.backgroundColor='blue'
        },
        update(element, binding) {
          element.value = binding.value;
        },
      });

      const vm2 = new Vue({
        el: "#app2",
        data() {
          return {
            msg: "欢迎学习Vue框架!",
            username: "lucy",
          };
        },
      });
      const vm = new Vue({
        el: "#app",
        data() {
          return {
            msg: "欢迎学习Vue框架!",
            username: "jack",
          };
        },
      });
    </script>
  </body>
</html>
相关推荐
爱丽_2 小时前
Vue Router 权限路由:动态路由、导航守卫与白名单的工程落地
前端·javascript·vue.js
小江的记录本2 小时前
【Filter / Interceptor】过滤器(Filter)与拦截器(Interceptor)全方位对比解析(附底层原理 + 核心对比表)
java·前端·后端·spring·java-ee·前端框架·web
独泪了无痕2 小时前
Vue3动态组件Component的深度解析与应用
前端·vue.js·web components
lbh10 小时前
当我开始像写代码一样和AI对话,一切都变了
前端·openai·ai编程
We་ct10 小时前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·数据结构·算法·leetcode·typescript·动态规划·取反
qq_4061761411 小时前
深入浅出 Pinia:Vue3 时代的状态管理新选择
javascript·vue.js·ecmascript
wefly201711 小时前
m3u8live.cn 在线M3U8播放器,免安装高效验流排错
前端·后端·python·音视频·前端开发工具
C澒12 小时前
微前端容器标准化 —— 公共能力篇:通用打印
前端·架构
德育处主任Pro12 小时前
前端元素转图片,dom-to-image-more入门教程
前端·javascript·vue.js