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>
相关推荐
小码哥_常10 小时前
Spring Boot配置diff:解锁配置管理新姿势
前端
小码哥_常10 小时前
告别onActivityResult!Android数据回传的3大痛点与终极解决方案
前端
hhcccchh10 小时前
1.2 CSS 基础选择器、盒模型、flex 布局、grid 布局
前端·css·css3
专吃海绵宝宝菠萝屋的派大星11 小时前
使用Dify对接自己开发的mcp
java·服务器·前端
爱分享的阿Q11 小时前
Rust加WebAssembly前端性能革命实践指南
前端·rust·wasm
蓝黑202011 小时前
Vue的 value=“1“ 和 :value=“1“ 有什么区别
前端·javascript·vue
小李子呢021111 小时前
前端八股6---v-model双向绑定
前端·javascript·算法
He少年12 小时前
【基础知识、Skill、Rules和MCP案例介绍】
java·前端·python
史迪仔011212 小时前
[QML] QML IMage图像处理
开发语言·前端·javascript·c++·qt
AI_Claude_code12 小时前
ZLibrary访问困境方案四:利用Cloudflare Workers等边缘计算实现访问
javascript·人工智能·爬虫·python·网络爬虫·边缘计算·爬山算法