数据绑定
每个标签都有属性,通过vue的指令,我们可以实现动态绑定,通常用于绑定表单的属性,组件传值
Vue中有2种数据绑定的方式
- 单项绑定 v-bind
- 双向绑定 v-model
1.v-bind
v-bind可用于动态绑定表单空间的value
当通过js修改绑定的值的时候,会自动同步表单控件中的值
vue
<template>
<input v-bind:value="val" />
</template>
<script>
export default {
data(){
return{
val:11
}
},
}
</script>v-bind可以有以下简写方式,即省略v-bind,只写一个冒号:
html
<input :value="val" />TIP
v-bind 的绑定是单项的,通过js修改data中的值会同步到表单控件中
但在表单控件中修改值,并不会修改data中的数据
2.v-model
v-model可用于表单控件中的双向绑定,也可用于自定义组件中的双向绑定,两者原理不同
vue
<template>
<input v-model="val" />
</template>
<script>
export default {
data(){
return{
val:11
}
},
}
</script>当表单控件通过v-model绑定data中数据时,data中数据修改会同步到表单控件中,表单空间修改也会同步data里的数据
2.1 表单控件双向绑定原理
其原理就是结合表单控件的value属性,和input事件
vue
<template>
<input :value="val" @input="val=$event.target.value"/>
</template>
<script>
export default {
data(){
return{
val:11
}
},
}
</script>2.2 组件双向绑定原理
在组件中,v-model父传子是prop实现,子传父是通过$emit('input')实现的
当组件中使用v-model时,会自动绑定一个@input事件
html
<Child v-model="value"/>相当于
vue
<Child :value="value" @input="(v)=> value = v"/>那么我们在子组件中就可以使用$emit('input',value)把数据传递给父组件
父组件通过v-model向子组件传递数据时,子组件props中应该接收的属性名为value
如下所示
vue
<template>
<Stars v-model="value"></Stars>
</template>
<script>
export default {
components: {
Stars: () => import('./views/Stars.vue'),
},
data() {
return {
value: 0,
}
},
}
</script>vue
<template>
<div>
{{ value }}
<button @click="$emit('input', value + 1)">add</button>
</div>
</template>
<script>
export default {
props: {
value: Number,
},
}
</script>