Vue中的选项
- 数据
- DOM
- 生命周期钩子
- 资源
- 组合
- 其他
1 数据
- data
- props
- propsData
- methods
- watch
1.1 data
Vue实例的数据对象
在初始化时,Vue会递归地把data的property转换为getter/setter
,能够响应数据变化,以_
和$
开头的property不会被处理
组件中的data必须返回一个初始数据对象的函数
,如果是一个对象,组件创建的多个实例会共享引用
这个数据对象。
1.2 computed
计算属性对象
函数形式的属性:仅读取
对象形式的属性:通过set/get函数读取和设置
data() {
return {
a: 1,
};
},
computed: {
fnA() {
return this.a * 2;
},
oA: {
get() {
return this.a + 1;
},
set(newVal) {
this.a = newVal * 2;
},
},
},
mounted() {
console.log(this.fnA); //2
console.log(this.oA); //2
console.log(this.a); //1
this.oA = 2;
console.log(this.oA); //5
console.log(this.a); //4
console.log(this.fnA); //8
},
1.3 methods
方法对象
混入到Vue实例中,可以直接通过vm实例访问这些方法,或者在指令表达式中使用。方法中的this
自动绑定为Vue实例
1.4 watch
设置数据侦测的对象
函数与字符串形式
data() { return { a: 1, b: { c: "bar" }, }; }, watch: { a: "show", b: "show", }, methods: { show(val, oldVal) { console.log(val, oldVal); }, }, mounted() { this.a = 2; //2 1 this.b.c = 2; },
函数形式就是把字符串替换为函数,不能深度侦测
对象形式
data() { return { a: 1, b: { c: "bar" }, }; }, watch: { a: { handler: "show", immediate: true, }, b: { handler: "show", deep: true, }, }, methods: { show(val, oldVal) { console.log(val, oldVal); }, }, mounted() { this.b.c = 2; }, // 1 undefined //observer observer
handler
后跟回调函数,immediate
为true会立即执行,deep
为true可以深度侦测数组形式
数组里可以使用字符串、函数、对象形式,组合起来使用,它们会
依次调用
,可以设置多个handler
1.5 props
接收父组件的数据,数组或对象
数组为简单形式
//父组件 <template> <div> <Child :name="{ obj, c }" /> </div> </template> <script> import Child from "./components/Child.vue"; export default { name: "App", data() { return { obj: { a: 1, b: 2, }, c: 3, }; }, components: { Child, }, }; </script> //子组件 <template> <div>{{ name }}</div> </template> <script> export default { props: ["name"], }; </script>
父组件传递数据后,子组件用数组接收即可使用
对象形式可以对接收的数据进行配置
//父组件 <Child :prop1="obj" :prop2="c" :prop3="d"/> //子组件 <template> <div> <span>{{ prop1 }}</span> <span>{{ prop2 }}</span> <span>{{ prop3 }}</span> </div> </template> <script> export default { props: { prop1: [Object, Array], prop2: Number, prop3: { type: Number, default: 0, required: false, validator(value) { return value >= 0; }, }, }, }; </script>
对象形式的props内的每个属性可以进行检测,单独一个值或数组中可以添加类型检测
验证
type
:类型检查String
,Number
,Boolean
,Array
,Object
,Date
,Fuction
,Symbol
,也支持自定义的构造函数,通过instanceof检查default
:未接收到数据的默认值
required
:布尔值
,该prop是否必须接收到validator
:判断函数
,将该prop作为参数传入,进行检查
当不满足条件时会报出警告
1.6 propsData
仅在new
创建的实例中使用
2 DOM
- el
- template
- render
- renderError
2.1 el
仅在new
创建实例时生效
提供一个在页面上已经存在的DOM元素作为Vue实例的挂载目标,可以是CSS选择器,也可以是一个HTMLElement实例。
2.2 template
一个字符串作为Vue实例的标识使用。模板将会替换挂载的元素。挂载的元素的内容都将被忽略,除非模板的内容有分发插槽
如果以#
开始,将被用作选择符,并使用匹配的innerHTML作为模板
选项中包含渲染函数时,该模板将被忽略
2.3 render
渲染函数
,字符串模板的替换方案
接收一个createElement方法作为第一参数用来创建VNode
如果组件是一个函数组件,渲染函数还会接收一个额外的context
参数,为没有实例的函数组件提供上下文信息。
选项中存在render
函数时,Vue构造函数不会从template
选项或通过el
选项指定的挂载元素中提取HTML模板编译渲染函数
render(createElement){
return createElement(
'App',
{
style:{
color:"red",
},
},
[
'text',
createElement('h1','头条')
]
)
}
createElemnt可以接收三个参数,第一个必选,后两两个可选
- 参数1:{String | Object | Function}
可以是一个HTML标签名,组件选项对象,或者resolve了上述任何一种的一个async函数 - 参数2:{Objcet}
一个模板中attribute对应的数据对象 - 参数3:{Stirng | Array}
子级虚拟节点
,由createElement()
构建,也可以使用字符串来生成文本虚拟节点
2.4 renderError
renderError(h,err)
只在开发者环境下工作,当render函数遭遇错误时,提供另一种渲染输出。
错误会作为第二个参数传递到renderError
3 资源
- directives
- filters
- components
3.1 directives
包含Vue实例可用指令的哈希表
Vue.directive
//局部注册
directives:{
focus:{
inserted(el,binding){
el.focus();
el.value = binding.value
}
}
}
3.2 filters
包含Vue实例可用过滤器的哈希表
Vue.filter
//局部注册
filters:{
upperCase(value){
return value.toUpperCase()
}
}
3.3 components
包含Vue实例可用组件的哈希表
Vue.component
//局部注册
import Child1 from './components/Child1.vue'
components:{
Child1,
Child2:{
template:"<h1>衬衫的价格是{{price}}</h1>",
data(){
return {
price:"九磅十五便士",
}
}
}
}
4 组合
- parent
- mixins
- extends
- provide/inject
4.1 parent
指定已创建实例的父实例,建立父子关系
子实例可以用this.$parent
访问父实例,
子实例被推入父实例的$children
数组中
let vm1 = new Vue({
el: "#root1",
data() {
return {
num: 1,
}
},
async mounted() {
await this.$nextTick()
console.log('vm1', this.$children[0].num)
},
})
let vm2 = new Vue({
el: "#root2",
data() {
return {
num: 2
}
},
parent: vm1,
mounted() {
console.log('vm2', this.$parent.num)
},
})
// vm2 1
// vm1 2
使用CLI时,局部注册的组件可以直接使用this.$parent与$children
4.2 mixins
接收一个混入对象的数组
Vue.mixin
//mixins.js
export const mixin1 = {
created() {
console.log(this._uid, "created")
},
}
export const mixin2 = {
mounted() {
console.log(this._uid, "mounted")
},
}
//main.js 全局注册
import { mixin1 } from './mixins'
Vue.mixin(mixin1)
//子组件 局部注册
import { mixin2 } from "../mixins";
export default {
mixins: [mixin2],
};
// 0 'created'
// 1 'created'
// 2 'created'
// 2 'mounted'
mixin的钩子按照传入顺序以此调用,在调用组件自身钩子之前被调用
可以做选项合并
,可复用的指令、组件、方法等可以合并到组件的选项中
4.3 extends
扩展组件,可以是选项对象或构造函数
与mixin
类似,mixin相当于多继承,extends为单继承
//extends.js
export const extend = {
data() {
return {
a: "extend"
}
},
}
//组件
import { extend } from "../extends";
export default {
extends: extend,
data() {
return {
b: "my",
};
},
mounted() {
console.log(this.$data);
},
};
//{a:'extentd',b:'my'}
4.4 provide/inject
祖组件向子孙后代注入
一个依赖
provide: 对象/函数返回对象
inject:字符串数组/对象
注入的数据是非响应式
的,可以传入可监听的对象可响应
注入一个对象
//祖组件 provide: { bar: "foo", }, //子孙组件 inject: ["bar"],//数组接收
注入函数,返回一个对象
//祖组件 provide(){ return { bar:'foo' } } //子孙组件 inject: { grand: { default: "接收失败", from: "bar", }, },
接收不同名的key时,需要设置from,default可以是一个函数访问本组件的数据
同名的key,default的值与key相同即可data与props可以将注入的值作为数据入口
inject: ["bar", "baz"], data() { return { a: this.bar, }; }, props: { b: { default() { return this.baz; }, }, },
5 其他
- name
- delimiters
- functional
- model
- inheritAttrs
- comments
5.1 name
组件名
语义化,便于调试
5.2 delimiters
自定义文本插入分隔符
默认:["{{","}}"]
与Vue.compile一样,只在完整版生效
5.3 functional
是否是函数式组件
无管理任何状态,无箭筒任何传递给它的状态,无生命周期方法,只接收一些prop
的函数
这意味着它无状态,没有响应式数据
,没有实例(没有this
上下文)
函数式组件可以添加render函数选项,render的第二个参数context可以为组件提供上下文
context包括的字段见官网
函数式组件
5.4 model
自定义组件在使用v-model
时定制prop和event
{prop:string,event:string}
默认的v-model
:{prop:"value",event:"input"}
//自定义组件
Vue.component('my-input', {
model: {
prop: 'uname',
event: 'change'
},
props: {
uname: {
type: String,
default: 'Tom'
},
value:String
},
template: '<input type="text" :value="uname" @input="updateVal($event.target.value)">',
methods: {
updateVal(val) {
this.$emit('change', val)
}
},
})
//跟实例
new Vue({
data() {
return {
uname: "张三"
}
},
}).$mount("#root1")
//html
<div id="root1">
<my-checkbox v-model="uname" value="李四"></my-checkbox>
</div>
- 子组件通过props接收v-model的值并传递给model选项中的prop
- 当数据改变时会触发事件change,传递一个值
- 父组件的v-model就接收到了传出的值,实现双向传递
v-model => props => model => :value @input => $emit => v-model
5.4 inheritAttrs
布尔值 默认为true
默认情况下父作用域的不被认作 props 的 attribute 绑定 (attribute bindings) 将会“回退”且作为普通的 HTML attribute 应用在子组件的根元素上
5.5 comments
布尔值 默认为false
是否保留且渲染模板中的HTML注释
仅在完整版中使用
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。