Vue
中data
为什么是一个方法
export default {
data() {
return {
//boody...
}
}
}
Vue
官方解释
当一个组件被定义,
data
必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例。如果data
仍然是一个纯粹的对象,则所有的实例将共享引用同一个数据对象!通过提供data
函数,每次创建一个新实例后,我们能够调用data
函数,从而返回初始数据的一个全新副本数据对象。
- 理解
Vue
中组件是可复用的,组件一旦创建好,可能在多个地方同时调用,但是对于data
不管你调用多少次,他们之间应该是互不干涉的,互不影响的;如果将
data
设计成对象的形式,而对象又是引用类型,多个地方创建实例的话,无论哪个实例其实都是引用同一个内存地址,所以就会导致 无论修改哪个组件实例都会影响其他实例,这也是我们不希望看到的所以: 组件中的
data
设计成函数的形式 每次创建组件实例 都会返回一份新数据,每份数据互不干涉,互不影响
vue如何添加自定义指令
局部自定义指令
<template>
<div class="home">
<!-- 指令使用 v-focus -->
<input type="text" v-focus>
</div>
</template>
<script>
export default {
name: "home",
directives: {
focus: {
// 指定定义
inserted(el) {
el.focus();
}
}
}
}
</script>
全局自定义指令
// 注册一个全局自定义指令 `v-focus`
Vue.directive('focus', {
// 当被绑定的元素插入到 DOM 中时……
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
指令相关概念
Vue
指令 钩子函数
bind
:只调用一次,指令第一次绑定到元素上时调用,可以进行一次初始化设置inserted
: 被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已经插入文档中)update
:所在组件的VNode
更新时调用,但是可能发生在其子VNode
更新之前,指令的值有可能更新, 有可能没有更新,不过可以通过更新前后的值来忽略不必要的模板更新componentUpdated
:指令所在组件的VNode
及其子VNode
全部更新后调用unbind
: 只调用一次,指令与元素解绑时调用
Vue
指令钩子函数参数
指令钩子函数会有如下参数:
el
:指令所绑定的元素,可以用来直接操作DOM
binding
:对象 属性如下name
:指令名,不包含v-
value
: 指令绑定值如v-my-directive="1 + 1"
,其值为2
oldvalue
:指令绑定的前一个值仅在update
和componentUpdated
钩子中可用,无论值是否改变都可以用expression
:字符串形式的指令表达式如v-my-directive="1 + 1"
表达式为1 + 1
arg
:指令参数可选如``v-my-directive:foo参数为
foo`modifiers
:包含修饰符的对象如v-my-directive.foo.bar
中修饰符对象为{foo: true, bar: true}
vnode
:Vue
编译生成的虚拟节点oldVnode
: 上一个虚拟节点,仅在update
和componentUpdated
钩子函数中有用
除了
el
之外,其他参数都应是只读的,切勿进行修改
vue如何自定义一个过滤器?
局部过滤器
<template>
<div class="home">
<input type="text" v-model="username">
<!-- 管道符 接 过滤器 -->
<h1>{{ username | capitalize}}</h1>
</div>
</template>
<script>
export default {
name: "home",
data() {
return {
username: ''
}
},
filters: {
// 定义局部过滤器
capitalize(val) {
if(!val) return '';
val = val.toString();
return val.charAt(0).toUpperCase() + val.slice(1)
}
}
}
</script>
全局过滤器
Vue.filter('capitalize', val => {
if (!val) return ''
val = val.toString()
return val.charAt(0).toUpperCase() + val.slice(1)
})
全局过滤器和局部过滤器使用方法相同只不过他们的作用域不同
vue
常用的修饰符
事件修饰符
.stop
.prevent
.capture
.self
.once
.passive
按键修饰符
.enter
.tab
.delete
(捕获“删除”和“退格”键).esc
.space
.up
.down
.left
.right
<!-- 只有在 `key` 是 `Enter` 时调用 `vm.submit()` -->
<input v-on:keyup.enter="submit">
系统修饰键
.ctrl
.alt
.shift
.meta
<!-- Alt + C -->
<input @keyup.alt.67="clear">
<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>
.exact
修饰符
.exact
修饰符允许你控制由精确的系统修饰符组合触发的事件。
<!-- 即使 Alt 或 Shift 被一同按下时也会触发 -->
<button @click.ctrl="onClick">A</button>
<!-- 有且只有 Ctrl 被按下的时候才触发 -->
<button @click.ctrl.exact="onCtrlClick">A</button>
<!-- 没有任何系统修饰符被按下的时候才触发 -->
<button @click.exact="onClick">A</button>
鼠标按钮修饰符
.left
.right
.middle