混入mixin
罕用场景
有两个类似的组件, 他们基本功能是一样的, 然而他们之前又存在差别,失常思维是: 是把它拆成两个不同的组件呢, 还是保留为一个组件,应用props传值来发明差别从而进行辨别
两个计划都不完满: 如果拆分成两个组件, 你就不得不冒着一旦性能变动就要在两个文件中更新代码的危险,
如果通过props传值很快会变得凌乱, 从而迫使维护者在应用组件的时候必须了解一大段的上下文,拖慢写代码速度
应用mixin, vue中的mixin对编写函数式格调的代码很有用, 因为函数式编程就是通过缩小挪动的局部让代码更好了解. mixin容许你封装一块在利用的其余组件都能够应用的函数, 如果应用切当,他们不会扭转函数作用域内部的任何货色.
根底实例
咱们有一对不同的组件,他们的作用是通过切换状态来展现或者暗藏模态框或者提示框, 这些提示框和模态框除了性能类似以外,没有其余共同点. 他们看起来不一样,用法不一样,然而逻辑一样~~~~
// 模态框
const Modal = {
template: '#modal',
data() {
return {
isShowing: false
}
},
methods: {
toggleShow() {
this.isShowing = !this.isShowing;
}
},
components: {
appChild: Child
}
}
// 提示框
const Tooltip = {
template: '#tooltip',
data() {
return {
isShowing: false
}
},
methods: {
toggleShow() {
this.isShowing = !this.isShowing;
}
},
components: {
appChild: Child
}
}
咱们能够在这里提取逻辑并创立能够被重用的项
const toggle = {
data() {
return {
isShowing: false
}
},
methods: {
toggleShow() {
this.isShowing = !this.isShowing;
}
}
}
const Modal = {
template: '#modal',
mixins: [toggle],
components: {
appChild: Child
}
};
const Tooltip = {
template: '#tooltip',
mixins: [toggle],
components: {
appChild: Child
}
};
用法
- 能够在我的项目里新建一个mixin目录, 创立一个js文件,在文件里须要输入一个对象
- 在modal.vue文件中引入这个mixin
<template>
<div>
<p v-show="isShowing">模态框显示</p>
<div @click="toggleShow">点击显示暗藏</div>
</div>
</template>
<script>
import {
toggle
} from './mixins/toggle'
export default {
name: 'modal',
data() {
return {
}
},
mixins: [toggle]
}
</script>
选项合并
当组件和混入对象有同名选项时,这个选项会以失当的形式进行合并
- 数据对象会在外部进行递归合并,发生冲突会以组件为先
- 同名的钩子函数会合并为一个数组, 将都被调用.混入对象的钩子将在组件钩子前调用
- 值为对象的选项, 比方methods components 和 directives, 将会合并为一个对象, 当对象键值对抵触时, 将会以组件为主
自定义组件
简介
vue容许自定义组件. 有些状况下, 也须要对原生dom进行操作.这时候就须要应用自定义组件
例子: 输入框,默认聚焦
<input v-focus />
directives: {
focus: {
inserted: function (el) {
el.focus();
}
}
}
钩子函数
一个自定义组件有以下钩子函数
- bind 只调用一次,指令第一次绑定元素时调用, 在这里能够进行初始化设置
- inserted 被绑定元素插入父节点时调用
- update 所在组件的vnode更新时调用
- componentUpdated 指令所在组件vnode及其子vnode全副更新后调用
- unbind 只调用一次, 指令与元素解绑时调用
过滤器
vue容许你自定义过滤器. 可被用于一些罕用的文件格式化.过滤器能够用在两个中央:双花括号插值和 v-bind
表达式 (后者从 2.1.0+ 开始反对)。过滤器应该被增加在 JavaScript 表达式的尾部,由“管道”符号批示:
<input v-focus v-model="message" />
<div id="hook-arguments-example">{{message | capitalize}}</div>
filters: {
capitalize: function (value) {
return value.toUpperCase()
}
}
发表回复