首页 > 其他分享 >零基础入门Vue之拘元遣将——其他常用指令&自定义指令

零基础入门Vue之拘元遣将——其他常用指令&自定义指令

时间:2024-02-09 12:33:19浏览次数:34  
标签:el Vue 自定义 binding vnode 指令 节点

回首

零基础入门Vue之梦开始的地方——插值语法 我记录了v-bind、v-on、v-model的学习

零基础入门Vue之To be or not to be——条件渲染 我记录了v-if、v-else-if、v-else、v-show的学习

零基础入门Vue之影分身之术——列表渲染&渲染原理浅析 我记录了v-for的学习

为了推进我的Vue的学习,本篇将一次性介绍其他常用指令,并且记录如何 自定义指令


其他常用指令

在Vue中,除了已学过的八个指令之外,还有另外五个比较常用的指令


v-text 文本绑定指令

更新元素的 textContent。如果要更新部分的 textContent,需要使用 {{ Mustache }} 插值。

假设有如下数据:

new Vue({
    el:"#root",
    data(){
        return {
            msg:"Hello world"
        }
    }
})

那么html除了使用插值语法来显示msg内容之外,还可以这样子写:

<div id="root">
    <span v-text="msg"></span>
</div>

v-html 富文本绑定指令

更新元素的 innerHTML。注意:内容按普通 HTML 插入 - 不会作为 Vue 模板进行编译。如果试图使用 v-html 组合模板,可以重新考虑是否通过使用组件来替代

如果是v-text,仅仅只会当作文本解析,但如果我掏出了v-html,那么我所写的内容将会作为html来解析

new Vue({
    el:"#root",
    data(){
        return {
            msg:"<h1>Hello worldM</h1>"
        }
    }
})

此时,使用v-html会自动解析<h1>这个标签

<div id="root">
    <span v-html="msg"></span>
</div>

警告:为了预防xss的攻击,千万不要在输入类元素或者具有提交类元素上使用v-html,请在可信任的元素上使用v-html


v-pre 阻止渲染指令

跳过这个元素和它的子元素的编译过程。可以用来显示原始 Mustache 标签。跳过大量没有指令的节点会加快编译。

假设dom节点中,有些元素不需要渲染的,即可给这个节点打上v-pre指令,用法如下:

  <div id="root">
      <span v-pre>这样子写:{{data里面的属性}} 标识Vue的插值语法</span>
  </div>

span标签里面的内容不会被Vue进行解析,这个指令可以提高渲染效率


v-cloak 渲染前标识指令

这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。

当给标签打上v-cloak时,未被解析的标签,会存在这个属性,当标签被解析时,这个属性消失,因此可以配合css这么用:

[v-cloak] {
  display: none;
}
<div id="root">
    <span v-html="msg" v-cloak></span>
</div>

当页面未被解析时,span标签没被显示,只有当页面被解析完成时,span标签才会出现

此指令可以语法网络卡顿时,未被解析的内容率先显示到页面上


v-once 指令

只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能

这个指令,使得节点只被解析一次,后续的数据修改,此指令都不会有任何变化

<div id="root">
    <span v-text="msg" v-once></span>
</div>

Vue 自定义指令

在创建Vue配置项中,directives配置项,允许使用的人注册自定义指令

其中自定义指令可分为:

  • 全局指令
  • 局部指令

局部指令

new Vue({
    el:"#root",
    directives:{
        orderName:{
            bind(el,binding,vnode,oldVnode){}, //指令第一次绑定到元素时调用
            inserted(el,binding,vnode,oldVnode){}, //绑定元素插入父节点调用
            update(el,binding,vnode,oldVnode){}, //当前模板更新前调用(可能不是当前节点的更新)
            componentUpdated(el,binding,vnode,oldVnode){}, //当前模板更新后调用(可能不是当前节点的更新)
            unbind(el,binding,vnode,oldVnode){} //指令解绑时调用
        },

    }
});
<div id="root">
    <!-- 注意虽然js里采用了驼峰命名,但标签使用时请用-连接每个单词 -->
    <span v-order-name="1+1">hello</span>
</div>

参数详解 如下(详情请查看官网):

  • el:当前绑定节点
  • binding:当前指令的绑定信息
  • vnode:当前虚拟节点
  • oldVnode:上一个虚拟节点

举个例子:假设我想创建一个v-big,指令使得绑定标签的文本放大到45px

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="./vue.js"></script>
    <title>Document</title>
</head>
<body>
    <div id="root">
        <!-- 注意虽然js里采用了驼峰命名,但标签使用时请用-连接每个单词 -->
        <span v-order-name>hello</span>
    </div>
</body>
<script>
    new Vue({
        el:"#root",
        directives:{
            orderName:{
                bind(el,binding,vnode,oldVnode){
                    el.style.fontSize = '45px';
                }
            },
        }
    });
</script>
</html>

改进:如果我希望,这个大小由我自己定义,而不是写死

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="./vue.js"></script>
    <title>Document</title>
</head>
<body>
    <div id="root">
        <!-- 注意虽然js里采用了驼峰命名,但标签使用时请用-连接每个单词 -->
        <span v-order-name="'45px'">hello</span>
    </div>
</body>
<script>
    new Vue({
        el:"#root",
        directives:{
            orderName:{
                bind(el,binding,vnode,oldVnode){
                    el.style.fontSize = binding.value;
                }
            },
        }
    });
</script>
</html>

更多的请参考官方例子:简介


全局指令

在Vue上一小节时,directives配置项配置出来的节点只允许当前Vue实例使用,当涉及到一个自定义指令给多个Vue实例/组件去使用,就该引入全局指令了

在Vue对象上有一个静态方法:directive

允许用户设置全局指令,并且能在多个实例中通用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="./vue.js"></script>
    <title>Document</title>
</head>
<body>
    <div id="root1">
        <!-- 注意虽然js里采用了驼峰命名,但标签使用时请用-连接每个单词 -->
        <span v-order-name="'45px'">hello</span>
    </div>
    <div id="root2">
        <!-- 注意虽然js里采用了驼峰命名,但标签使用时请用-连接每个单词 -->
        <span v-order-name="'78px'">hello</span>
    </div>
</body>
<script>
    Vue.directive("orderName",{
        bind(el,binding,vnode,oldVnode){
            el.style.fontSize = binding.value;
        }
    });

    new Vue({
        el:"#root1",
    });

    new Vue({
        el:"#root2",
    });
</script>
</html>

其配置项与局部指令雷同,再次不过多赘述


指令简写形式

如果你不关注自定义的指令执行时机的话,你可以直接写成如下形式:

new Vue({
    el:"#root",
    directives:{
        orderName(){},
    }
});

此时,执行实际,与binding一样


The End

本篇完~~~

标签:el,Vue,自定义,binding,vnode,指令,节点
From: https://www.cnblogs.com/Star-Vik/p/18012413

相关文章

  • 【Vue】使用iframe解决多应用整合问题(微前端)
    一、需求背景有老系统需要重构,新做的系统需要做一个大一统的整合,类似一个分类栏目在菜单位置罗列出有什么子系统应用,点击对应的应用菜单,展示区跳转到相应的子系统应用中我用Excel简单描述了下系统的页面效果: 二、技术方案第一种,使用iframe实现,html提供了iframe标签实现页......
  • vue下载文件超过10M被拒绝
    原文链接:https://www.jianshu.com/p/3810d7e463b1一问题现象昨天一朋友遇到超过10M文件,springboot下载文件被拒绝的问题,是秒拒绝。第一反应是不是springboot的配置了限制,通过检查配置,代码和配置中都有文件配置的代码,最大的大小设置为200MB了,根本不存在问题。其他文件下载小......
  • 扩展说明: 指令微调 Llama 2
    这篇博客是一篇来自MetaAI,关于指令微调Llama2的扩展说明。旨在聚焦构建指令数据集,有了它,我们则可以使用自己的指令来微调Llama2基础模型。目标是构建一个能够基于输入内容来生成指令的模型。这么做背后的逻辑是,模型如此就可以由其他人生成自己的指令数据集。这在当想开发......
  • 【实用技巧】【Mybatis】自定义的动态 SQL
    1 前言平时我们可能会拼接SQL,尤其是做一些报表的开发或者连表查询的时候,当条件发生变更或者关联关系需要改变的时候,就需要更改代码里的SQL,所以我这里弄了一个简易版的基于Mybatis的动态SQL调用。2 实现主要是Mybatis的动态SQL://controller层@Override@PostMapp......
  • CMakeLists常用指令
    #指定cmake最低版本cmake_minimum_required(VERSION3.10.2)#指定工程名字和支持的语言project(testLANGUAGESCXX)#指定cmake模块路径set(CMAKE_MODULE_PATH"${CMAKE_SOURCE_DIR}/cmake")#指定C++标准set(CAMKE_CXX_STANDARD17)#搜索第三方包......
  • Prompt原则 - 强调行动指令而非限制
    在与语言模型(LLM)的交流中,明确指导(告诉它做什么)往往比单纯指出禁止行为(告诉它不做什么)更加有效。这种方法的优点在于能够更直接、更精确地引导模型的回答方向,减少模型需要考虑的可能性范围,从而提高获取期望答案的几率。OpenAI的官方文档https://help.openai.com/en/articles/66......
  • Prompt原则 - 强调行动指令而非限制
    在与语言模型(LLM)的交流中,明确指导(告诉它做什么)往往比单纯指出禁止行为(告诉它不做什么)更加有效。这种方法的优点在于能够更直接、更精确地引导模型的回答方向,减少模型需要考虑的可能性范围,从而提高获取期望答案的几率。OpenAI的官方文档https://help.openai.com/en/articles/66......
  • Prompt原则 - 强调行动指令而非限制
    在与语言模型(LLM)的交流中,明确指导(告诉它做什么)往往比单纯指出禁止行为(告诉它不做什么)更加有效。这种方法的优点在于能够更直接、更精确地引导模型的回答方向,减少模型需要考虑的可能性范围,从而提高获取期望答案的几率。OpenAI的官方文档https://help.openai.com/en/articles/66......
  • Prompt原则 - 强调行动指令而非限制
    在与语言模型(LLM)的交流中,明确指导(告诉它做什么)往往比单纯指出禁止行为(告诉它不做什么)更加有效。这种方法的优点在于能够更直接、更精确地引导模型的回答方向,减少模型需要考虑的可能性范围,从而提高获取期望答案的几率。OpenAI的官方文档https://help.openai.com/en/articles/66......
  • 在vue中使用amis
    之前在使用amis时,是通过百度给的一个完整amis示例来用的,没有结合到自己的vue项目中,传送门:低代码平台amis学习本次简单介绍下,如何在vue中引入ami1、首先要在vue项目中引入amis的sdk引入方式有2种:(1)使用cdn方式  (2)下载sdk文件-本地引用(1)使用cdn方式,直接引用远程资源打......