IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue自定义指令、过滤器、混入的介绍和案例 -> 正文阅读

[JavaScript知识库]Vue自定义指令、过滤器、混入的介绍和案例

自定义指令

官方指令在不够用的情况下,考虑自定义指令,自定义指令用来操作dom

全局定义

Vue.directive("指令名",{
????????bind:function(el,binding){
????????},
????????inserted:function(el,binding){
????????},
????????update:function(el,binding){
????????}
})

钩子函数

  • bind: 当指令首次绑定在dom元素上时使用,此时dom还未渲染
  • inserted:当dom元素已经渲染到页面上时调用
  • updated:当m层数据发生变化时,v层也会跟着变化

钩子函数的参数

  • el:绑定指令的dom元素
  • binding:是个对象,包含了指令的所有相关信息,指令名、修饰符、所绑定的属性、赋的值(binding.arg代表绑定的属性? ? binding.value代表绑定属性的值)

v-bind:属性="变量"? 实现动态绑定的原理

?? ?<div id="box">
?? ??? ??? ?<img v-mybind:src="img" />
?? ??? ?</div>

Vue.directive("mybind", {
?? ??? ?bind(el, binding) {
?? ??? ??? ?el[binding.arg] = binding.value
?? ??? ?},
?? ??? ?updated(el, binding) {
?? ??? ??? ?el[binding.arg] = binding.value
?? ??? ?}
?? ?})
?? ?let vm = new Vue({
?? ??? ?el: "div",
?? ??? ?data: {
?? ??? ??? ?img: "12312.jpg"
?? ??? ?}
?? ?})

简写如下(相当于bind+updated)

????Vue.directive("mybind", function(el, binding) {
?? ??? ?el[binding.arg] = binding.value
?? ?})
?? ?let vm = new Vue({
?? ??? ?el: "div",
?? ??? ?data: {
? ?????????img: "12312.jpg"
????????}
?? ?})

点击回到顶部案例

?<div id="box">
?? ??? ??? ?<div v-top style="position:fixed;bottom:10px;right:10px;width: 100px;height: 100px;background-color:red;">
?? ??? ??? ??? ?回到顶部
?? ??? ??? ?</div>
</div>

Vue.directive("top", {
?? ??? ?inserted(el) {
?? ??? ??? ?el.onclick = function() {
?? ??? ??? ??? ?document.body.scrollTop = document.documentElement.scrollTop = 0
?? ??? ??? ?}
?? ??? ?}
?? ?});

?? ?let vm = new Vue({
?? ??? ?el: "#box",
?? ??? ?data: {}
?? ?});

局部定义(只能在该vue对象中使用)?

<div id="box">
?? ??? ??? ?<img v-mybind:src="img" />
?</div>

let vm = new Vue({
?? ??? ?el: "#box",
?? ??? ?data: {
?? ??? ??? ?img: "imgsda.jpg"
?? ??? ?},
?? ??? ?directives: {
?? ??? ??? ?"mybind": function(el, binding) {
?? ??? ??? ??? ?el[binding.arg] = binding.value;
?? ??? ??? ?}
?? ??? ?}
?? ?})


过滤器

对数据在模板中的表现进行过滤,用于格式的转换,如0/1转换为失败/成功

全局定义

Vue.filter("过滤器名",function(变量,参数,....){
? ? ? ? return 转换的结果
})

使用(在模板上使用)

{{变量 | 过滤器名(参数,....)}}

全局定义案例?

?<div id="box">
?? ??? ??? ?<p>是否成年:{{isAdult | convert(2)}}</p>
? ?</div>

Vue.filter("convert", function(value, a) {
?? ??? ?return value ? "已成年" : "未成年"
?? ?});
?? ?let vm = new Vue({
?? ??? ?el: "div",
?? ??? ?data: {
?? ??? ??? ?isAdult: true
?? ??? ?}
?? ?})

局部定义案例

?<div id="box">
?? ??? ??? ?<p>是否成年:{{a| convert}}</p>
?? ??? </div>

let vm = new Vue({
?? ??? ?el: "#box",
?? ??? ?data: {
?? ??? ??? ?a: false
?? ??? ?},
?? ??? ?filters: {
?? ??? ??? ?convert(val) {
?? ??? ??? ??? ?return val ? "成年" : "未成年"
?? ??? ??? ?}
?? ??? ?}
?? ?})

理解:将a变量的值传递给过滤器,过滤器用第一个形参val接收此值,并经过过滤转换,返回结果


混入

意义在于提高复用性,将一些相同的逻辑函数进行封装,如数组去重,排序等,混入对象就是一个json对象,属性就是vue对象的配置项,但没有el

定义格式

let mixin1={
? ? ? ? data:{},
? ? ? ? methods:{}
}
let mixin2={
? ? ? ? data:{},
? ? ? ? methods:{}
}

局部混入

let vm=new Vue({

el:"",

mixins:[mixin1,mixin2],

data:{}

})

全局混入(不推荐使用)

?Vue.mixin(mixin1)

案例

?<div id="box">
? ? ? ? <p>msg:{{msg}}</p>
? ? ? ? <input type="button" value="测试" @click="fn02">?
? ? </div>

let m1 = {
?? ??? ?data: {
?? ??? ??? ?msg: "hello"
?? ??? ?},
?? ??? ?methods: {
?? ??? ??? ?m1fn() {
?? ??? ??? ??? ?console.log("m1fn");
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?let vm = new Vue({
?? ??? ?el: "#box",
?? ??? ?mixins: [m1],
?? ??? ?data: {},
?? ??? ?methods: {
?? ??? ??? ?fn02() {
?? ??? ??? ??? ?this.m1fn();
?? ??? ??? ??? ?console.log(this.msg);
?? ??? ??? ?}
?? ??? ?}
?? ?});

面试问题:自定义指令、过滤器、混入的使用场景

  • 自定义指令:主要用来完成dom操作,并用在模板上
  • 过滤器:主要完成数据格式的转换,不做逻辑运算,如日期的转换,true和false转换成对应的结果
  • 混入:主要完成功能,将一些相同的逻辑函数进行封装,提高代码复用性,如排序,数组去重

?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-11 23:54:12  更:2022-01-11 23:55:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:42:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码