VUE中父子组件传递数据的基本套路:
props
this.$emit('事件名', '数据');
sync
修饰符,实现支持同步数据
因为用的是 uniapp 开发小程序,所以要考虑到兼容性问题,不要把自己当正经VUE2。
小程序虽然支持 v-model
指令,但不支持 model
选项。
所以要么子组件中声明默认的 value
这个 props 来接收值。
要么手动:绑定属性
和事件
由于小程序不支持 model
选项。
这个方案中:子组件里只能使用 value
接收数据,更新时触发 input
。
<template>
<view>
<view><text>父组件:{{ msg }}text>view>
<vmodel-component v-model="msg">vmodel-component>
view>
template>
<script>
export default {
data() {
return { msg: '大家好,我是:使用 v-model' }
},
methods: {}
}
script>
<style>
style>
<template>
<view>
<view> 子组件:{{value}} view>
<button @click="onclick" >更新button>
view>
template>
<script>
export default {
data() {return {};},
props:{
value:{ type: String, default: "未收到父值" }
},
methods:{
onclick(e){
this.$emit('input', '我是笨笨'); // v-mode
}
}
}
script>
<style>
style>
当然一般都会用简写形式:
v-bind:
缩写为 :
v-on:
缩写为 @
由于是自己手绑定,props
和 事件名
都可以自己定。
比如在子组件中我就用 msg
接收数据。
事件我自己取名叫 customEvent
。
<template>
<view>
<view><text>父组件:{{ msg }}text>view>
<novmodel-component :msg="msg" @customEvent="e => msg = e">novmodel-component>
view>
template>
<script>
export default {
data() {
return { msg: '大家好,我是:不使用 v-model' }
},
methods: {}
}
script>
<style>
style>
<template>
<view>
<view> 子组件:{{msg}} view>
<button @click="this.$emit('customEvent', '我是笨笨')" >更新button>
view>
template>
<script>
export default {
data() {return {};},
props:{
msg:{ type: String, default: "未收到父值" }
},
methods:{}
}
script>
<style>
style>
使用 sync 时可以自己决定绑到子组件的哪个 props
上,比如就绑到了 msg
上。
同步数据时触发 update:要更新的props
<template>
<view>
<view><text>父组件:{{ msg }}text>view>
<sync-component :msg.sync="msg">sync-component>
view>
template>
<script>
export default {
data() {
return { msg: '大家好,我是:使用 sync 修饰符,实现同步数据' }
},
methods: {}
}
script>
<style>
style>
<template>
<view>
<view> 子组件:{{msg}} view>
<button @click="$emit('update:msg', '我是笨笨')" >更新button>
view>
template>
<script>
export default {
data() {return {};},
props: {
msg: { type: String, default: "未收到父值" }
},
methods:{}
}
script>
<style>
style>
uniapp官方文档 :模板指令 v-model
uniapp官方文档 :.sync 修饰符
vue2官方文档:选项 model