把它们放在一起写呢,是因为它们都分为两种——局部注册和全局注册。
需要注意的是:这三者的局部注册(有s)和全局注册(没有s)使用到的关键单词类似,请注意区分。
另外,过滤器的全局注册、自定义指令的全局注册和组件的全局注册都要写在Vue实例之前,详情请看: https://blog.csdn.net/weixin_55992854/article/details/119107461
目录
过滤器
-
作用:处理数据格式
-
使用位置:双花括号插值 和 v-bind 表达式 (后者从 2.1.0+ 开始支持)。
-
分类:局部注册和全局注册
局部注册
-
在Vue实例对象的选项中配置过滤器filters:{}
-
过滤器的名字: (要过滤的数据)=>{return 过滤的结果}
-
在视图中使用过滤器: {{被过滤的数据 | 过滤器的名字}
<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实例对象
全局注册
-
在创建 Vue 实例之前定义全局过滤器Vue.filter()
-
Vue.filter('过滤器的名字',(要过滤的数据)=>{return 对数据的处理结果});
-
在视图中通过{{数据 | 过滤器的名字}}或者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 元素进行操作,这时候就会用到自定义指令
-
分类:全局注册和局部注册
局部注册
-
在Vue实例对象的选项中设置自定义指令 directives:{}
-
directives:{'指令的核心名称':{ inserted: (使用指令时的DOM对象) => { 具体的DOM操作 } }}
-
在视图中通过标签去使用指令
<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实例所管理的视图中使用
全局注册
-
在创建 Vue 实例之前定义全局自定义指令Vue.directive()
-
Vue.directive('指令的名称',{ inserted: (使用指令的DOM对象) => { 具体的DOM操作 } } );
-
在视图中通过"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>
问题:
代码重复冗余
不利于维护
解决方案: 使用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接收相同的选项:例如
data
、computed
、watch
、methods
以及生命周期钩子等。 -
仅有的例外是像
el
这样根实例特有的选项
-
-
另外, 组件也有自己的选项 template、components等
组件的特点
-
组件是一种封装
-
组件能够让我们复用已有的html、css、js
-
可复用
-
是一个特殊的Vue实例
-
可以任意次数的复用
-
每用一次组件,就会有一个它的新实例被创建
-
组件中的data要求必须是一个函数,且需要返回一个对象
-
组件有自己的作用域
-
-
template每个组件模板有且只有一个根元素
建议: 在实际开发中,尽可能使用各种第三方组件element-ui/mint-ui/iview等
组件的分类和使用
-
分类:全局注册和局部注册
-
使用(步骤):1. 注册组件 2. 通过组件名字使用组件
全局注册
-
使用Vue.component(组件名,组件选项) 进行注册
组件名:推荐小写加减号的命名方式
-
用在其被注册之后的任何 (通过
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>
注意:
全局组件必须写在Vue实例创建之前,才在该根元素下面生效
在不同的Vue实例中可以使用多个不同的全局组件
每个组件有自己的作用域
局部注册
-
直接在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>