vue学习之-----v-model数据双向绑定,自定义组件父子传参

1、官网定义:

v-model指令-----在表单input,textarea及select元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。

v-model本质上是语法糖,它负责监听用户的输入事件以更新数据。

<template>
    <div>
        <div>v-model一般使用方式:</div>
        <div>
            <input v-model="message">
            <p>同步更新为: {{ message }}</p>
        </div>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                message: "初始值"
            }
        }
    }
</script>

<style>
</style>

效果:

//相当于把输入值value属性绑定为动态值,这个值被input方法控制为输入值本身,这就使得输入值变为公用值,实现联动:
......
<input :value="message" @input="inputMessage" />
......

//inputMessage方法为:
inputMessage(e){
  this.message= e.target.value
}

2、在父子传参中的用法:

官网中的这句话-------“一个组件上的v-model默认会利用名为value的 prop 和名为input的事件”

可以理解为:父子组件想通过v-model实现数据双向联动,则默认父组件调用子组件时,会把值传递给名为value的prop,而子组件触发input事件时会更新父组件中传递的value值!

而value和input是可以通过model选项自己定义的。

(1)子组件中是input输入框的情况:

》》父组件

<template>
    <div>
        <div>v-model一般使用方式:</div>
        <div>
            <input v-model="message">
            <input :value="message" @input="inputMessage" />
            <p>同步更新为: {{ message }}</p>
        </div>
        <h5>父子传参中v-model的使用:子组件中是input输入框</h5>
        <vModelCpn v-model="message"></vModelCpn>
    </div>
</template>

<script>
    import vModelCpn from './components/v-model-cpn.vue'
    export default {
        components:{
            vModelCpn
        },
        data() {
            return {
                message: "初始值"
            }
        },
        methods:{
            inputMessage(e){
                this.message= e.target.value
            }
        }
    }
</script>

<style>
</style>

》》子组件

<template>
    <div>
        <input v-model="valueA" />
    </div>
</template>

<script>
    export default{
        props:['value'],
        data(){
            return{
                valueA:""
            }
        },
        watch:{
            value:{
                handler(val){
                    this.valueA=val
                },
                deep:true
            }
        },
        mounted(){
            this.valueA=this.value
        },
        methods:{
            
        }
    }
</script>

<style>
</style>

效果:

 

 (2)子组件中不是表单元素的情况:

》》父组件------同上

》》子组件

<template>
    <div>
        <!-- <input v-model="valueA" /> -->
        <p>p标签能同步吗????------{{valueA}}</p>
        <button @click="changeValue" type="button">改变value值</button>
    </div>
</template>

<script>
    export default {
        props: ['value'],
        model: {
            prop: 'checked',
            event: 'change'
        },
        data() {
            return {
                valueA: ""
            }
        },
        watch: {
            value: {
                handler(val) {
                    this.valueA = val
                },
                deep: true
            }
        },
        mounted() {
            this.valueA = this.value
        },
        methods: {
            changeValue() {
                this.valueA = "改变后的值-----hello!!!"
                // this.$emit("input", "改变后的值-----hello!!!")//默认监听input事件
                this.$emit("change", "改变后的值-----hello!!!","3333")
            }
        }
    }
</script>

<style>
</style>

效果:

 

个人通俗易懂理解:

v-model通过监听input,change等表单事件来同步prop值,如果子组件不是表单元素,就用自定义事件this.$emit造一个表单事件~~

 

posted @ 2021-09-04 23:05  程序员冒冒  阅读(850)  评论(0编辑  收藏  举报