过滤器、自定义指令、组件三者的注册及使用场景

把它们放在一起写呢,是因为它们都分为两种——局部注册和全局注册。

需要注意的是:这三者的局部注册(有s)全局注册(没有s)使用到的关键单词类似,请注意区分。

另外,过滤器的全局注册、自定义指令的全局注册和组件的全局注册都要写在Vue实例之前,详情请看: https://blog.csdn.net/weixin_55992854/article/details/119107461

目录

过滤器

局部注册

全局注册

拓展

      1.过滤器是可以传参数的

      2.过滤器可以串联使用

自定义指令

局部注册

全局注册

组件

什么是组件

组件的特点

组件的分类和使用

全局注册

局部注册


过滤器

  • 作用:处理数据格式

  • 使用位置:双花括号插值 和 v-bind 表达式 (后者从 2.1.0+ 开始支持)。

  • 分类:局部注册和全局注册

局部注册

  1. 在Vue实例对象的选项中配置过滤器filters:{}

  2. 过滤器的名字: (要过滤的数据)=>{return 过滤的结果}

  3. 在视图中使用过滤器: {{被过滤的数据 | 过滤器的名字}

<body>
    <div id="app">
        <p>处理前:{{msg}}</p>
        <!-- 3. 调用过滤器 -->
        <p>处理后:{{msg | toUpper}}</p>
    </div>
    <div id="aaa">
        <p>处理前:{{msg}}</p>
        <p>处理后:{{msg | toUpper}}</p>
    </div>
</body>

<script src="./vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            msg: 'kfc'
        },
        // 1. 设置vue实例的过滤器filters选项
        filters: {
            toUpper: function(v) {
                // 2. 在过滤器的方法中操作数据并返回结果
                return v.toUpperCase();
            }
        }
    });
</script>

注意: 局部注册的过滤器只适用于当前Vue实例对象

全局注册

  1. 在创建 Vue 实例之前定义全局过滤器Vue.filter()

  2. Vue.filter('过滤器的名字',(要过滤的数据)=>{return 对数据的处理结果});

  3. 在视图中通过{{数据 | 过滤器的名字}}或者v-bind使用过滤器

<body>
    <div id="app">
        <p>处理前:{{msg}}</p>
        <!-- 3. 调用过滤器: (msg会自动传入到toUpper中)-->
        <p>处理后:{{msg | toUpper}}</p>
    </div>
    <div id="aaa">
        <p>处理前:{{msg}}</p>
        <p>处理后:{{msg | toUpper}}</p>
    </div>
</body>

<script src="./vue.js"></script>
<script>
    // 1. 定义全局过滤器
    Vue.filter('toUpper', (value) => {
        console.log(value);
        // 2. 操作数据并返回
        value = value.toLowerCase();
        console.log(value);
        return value;
    });

    new Vue({
        el: '#app',
        data: {
            msg: 'hello'
        },
    });
    new Vue({
        el: '#aaa',
        data: {
            msg: 'hello'
        },
    });
</script>

注意: 全局注册的过滤器, 不同的Vue实例对象都可以使用

拓展

      1.过滤器是可以传参数的

<div id="app">
    {{count | toD("元")}}
</div>

<script src="../js/vue.js"></script>
<script>
    //(v,y)中v指的是被处理的数据count,y指的是自己传入的参数("元")
    Vue.filter("toD", (v, y) => {
        console.log(v);
        console.log(y);
        return "$" + v + y;
    });


    new Vue({
        el: "#app",
        data: {
            count: 100,
        },
    });
</script>

      2.过滤器可以串联使用

<div id="app">
    <!-- 
        2.串联使用 
        {{被处理的数据 | 过滤器A | 过滤器B}}
        注意: 过滤器A处理的是count
        过滤器B处理的是过滤器A所返回的结果
    -->
    {{count | A | C("元")}}
</div>

<script src="../js/vue.js"></script>
<script>

    Vue.filter("A", (v) => {
        return "$" + v;
    });
    Vue.filter("C", (v, y) => {
        console.log(v);//$100
        return v + y;
    });

    new Vue({
        el: "#app",
        data: {
            count: 100,
        },
    });
</script>

自定义指令

  • 使用场景:需要对普通 DOM 元素进行操作,这时候就会用到自定义指令

  • 分类:全局注册和局部注册

局部注册

  1. 在Vue实例对象的选项中设置自定义指令 directives:{}

  2. directives:{'指令的核心名称':{ inserted: (使用指令时的DOM对象) => { 具体的DOM操作 } }}

  3. 在视图中通过标签去使用指令

<div id="app">
    <!-- 3. 在视图中通过标签去使用指令 -->
    <input v-focus type="text">
</div>

<script src="./vue.js"></script>
<script>
    new Vue({
        el: '#app',
        // 1. 在vm对象的选项中设置自定义指令 directives:{}
        directives: {
            // 2. directives:{'指令的核心名称':{ inserted: (使用指令时的DOM对象) => { 具体的DOM操作 } }}
            focus: {
                // 指令的定义
                inserted: function(el) {
                    el.focus();
                }
            }
        }
    });
</script>

注意:只能在该选项所在的vue实例所管理的视图中使用

全局注册

  1. 在创建 Vue 实例之前定义全局自定义指令Vue.directive()

  2. Vue.directive('指令的名称',{ inserted: (使用指令的DOM对象) => { 具体的DOM操作 } } );

  3. 在视图中通过"v-自定义指令名"去使用指令

<div id="app">
    <!-- 3. 在视图中通过标签去使用指令 -->
    <input v-focus type="text">
</div>

<script src="./vue.js"></script>
<script>
    // 全局自定义指令
    // 1.在创建 Vue 实例之前定义全局自定义指令Vue.directive()
    // 2. Vue.directive('指令的核心名称',{ inserted: (使用指令时的DOM对象) => { 具体的DOM操作 } } );
    Vue.directive('focus', {
        // 当被绑定的元素插入到 DOM 中时,inserted会被调用
        inserted: (el) => {
            // el 就是指令所在的DOM对象
            el.focus();
        }
    });

    new Vue({
        el: '#app'
    });
</script>

Vue.directive(自定义指令名) 不需要加v- 使用自定义指令时需要加v-

inserted:当被绑定的元素插入到 DOM 中时,会被调用

组件

什么是组件

需求:如果页面中有多个一样结构的控件,比如

<div id="app">
    <!-- 页面中有多个一样结构的标签: span+button -->
        <span>{{count1}}</span> <button @click="changeCount1">按钮</button> <br>
        <span>{{count2}}</span> <button @click="changeCount2">按钮</button> <br>
        <span>{{count3}}</span> <button @click="changeCount3">按钮</button> <br>
        <span>{{count4}}</span> <button @click="changeCount4">按钮</button> <br>
        <span>{{count5}}</span> <button @click="changeCount5">按钮</button> <br>
</div>

<script src="./vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            count1: 0,
            count2: 0,
            count3: 0,
            count4: 0,
            count5: 0
        },
        methods: {
            changeCount1() {
                this.count1++;
            },
            changeCount2() {
                this.count2++;
            },
            changeCount3() {
                this.count3++;
            },
            changeCount4() {
                this.count4++;
            },
            changeCount5() {
                this.count5++;
            }
        }
    });
</script>

问题:

  1. 代码重复冗余

  2. 不利于维护

解决方案: 使用Vue中一个十分重要的特性--组件

<div id="app">
    <!-- 2. 使用组件 -->
    <span-btn></span-btn>
    <span-btn></span-btn>
    <span-btn></span-btn>
    <span-btn></span-btn>
</div>

<script src="./vue.js"></script>
<script>
    // 注册全局组件
    Vue.component('span-btn', {
        template: `
			<div>
				<span>{{count}}</span> 
				<button @click="changeCount">按钮</button>
                <br>
    		</div>
		`,
        data() {
            return {
                count: 0
            }
        },
        methods: {
            changeCount() {
                this.count++;
            }
        }
    });

    new Vue({
        el: '#app'
    });
</script>

什么是组件:

组件系统是 Vue 的另一个重要概念,允许我们使用小型、独立和通常可复用的组件构建大型应用。

仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:

例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。

  • 组件是可复用的 Vue 实例,且带有一个名字

  • 组件的选项:

    • 组件与new Vue接收相同的选项:例如 datacomputedwatchmethods 以及生命周期钩子等。

    • 仅有的例外是像 el 这样根实例特有的选项

  • 另外, 组件也有自己的选项 template、components等

组件的特点

  • 组件是一种封装

  • 组件能够让我们复用已有的html、css、js

  • 可复用

  • 是一个特殊的Vue实例

  • 可以任意次数的复用

  • 每用一次组件,就会有一个它的新实例被创建

  • 组件中的data要求必须是一个函数,且需要返回一个对象

    • 组件有自己的作用域

  • template每个组件模板有且只有一个根元素

建议: 在实际开发中,尽可能使用各种第三方组件element-ui/mint-ui/iview等

组件的分类和使用

  • 分类:全局注册和局部注册

  • 使用(步骤):1. 注册组件 2. 通过组件名字使用组件

全局注册

  1. 使用Vue.component(组件名,组件选项) 进行注册

    组件名:推荐小写加减号的命名方式

  2. 用在其被注册之后的任何 (通过 new Vue) 新创建的 (一个或者多个)Vue 实例

Vue.component('组件名', {
    // 组件选项: data methods template等(没有el)
    // data 的值是一个函数, 需要返回一个对象
});
<div id="app">
    <!-- 2. 使用组件 -->
    <span-btn></span-btn>
    <span-btn></span-btn>
    <span-btn></span-btn>
    <span-btn></span-btn>
</div>
<hr>
<div id="app1">
    <span-btn></span-btn>
    <My-Component></My-Component>
</div>
<hr>
<div id="app2">
    <span-btn></span-btn>
</div>
<hr>
<div id="app3">
    <span-btn></span-btn>
</div>

<script src="./vue.js"></script>
<script>
    // 1. 注册组件
    // Vue.component('组件名', {
    //     // 组件选项: data methods template等
    // });

    Vue.component('span-btn', {
        // template: 页面字符串,有且仅有一个根元素
        template: `
			<div>
				<span>{{count}}</span> 
				<button @click="changeCount">按钮</button>
                <br>
    		</div>
		`,
        data() {
            return {
                count: 0
            }
        },
        methods: {
            changeCount() {
                this.count++;
            }
        }
    });

    Vue.component('myComponent', {
        template: `
			<div>
				<h1>{{num}}</h1> 
				<button @click="changeTitle">按钮</button>
                <br>
    		</div>
		`,
        style: './style.css',
        data() {
            return {
                num: 0
            }
        },
        methods: {
            changeTitle() {
                this.num++;
            }
        }
    });

    new Vue({
        el: '#app'
    });

    new Vue({
        el: '#app1'
    });
    new Vue({
        el: '#app2'
    });
    new Vue({
        el: '#app3'
    });
</script>

注意:

  1. 全局组件必须写在Vue实例创建之前,才在该根元素下面生效

  2. 在不同的Vue实例中可以使用多个不同的全局组件

  3. 每个组件有自己的作用域

局部注册

  • 直接在Vue实例里面通过 components选项进行注册

  • 对于 components 对象中的每个属性来说,

    • 其属性名就是自定义元素的名字,其属性值就是这个组件的选项对象。

<body>
    <div id="app">
        <!-- 2 使用组件 -->
        <com-A></com-A>
        <com-B></com-B>
        <com-C></com-C>
    </div>
</body>

<script src="./vue.js"></script>
<script>
    // 局部组件的选项
    const comA = {
        template: `<div>{{titleA}}</div>`,
        data() {
            return {
                titleA: 'comA中的data里的titleA'
            }
        }
    };
    const comB = {
        template: `<div>{{titleB}}</div>`,
        data() {
            return {
                titleB: 'comB中的data里的titleB'
            }
        }
    };

    const comC = {
        template: `<div>{{titleC}}</div>`,
        data() {
            return {
                titleC: 'comC中的data里的titleC'
            }
        }
    };

    new Vue({
        el: '#app',
        // 1. 在Vue实例中设置components选项{组件名:组件选项}
        components: {
            // 在页面中的组件名:组件选项
            'comA': comA,
            'comB': comB,
            'comC': comC
        }
    });
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值