zoukankan      html  css  js  c++  java
  • 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造一个表单事件~~

  • 相关阅读:
    Could not get lock /var/lib/apt/lists/lock
    使用vmware提示无法打开内核设备 \.Globalvmx86: 系统找不到指定的文件
    Linux 下安装 MATLAB
    超级干货:Linux常用命令 & 实用命令万字总结!
    GNB 配置图图解
    GNB Linux 部署说明
    解决Firefox启动、打开网页慢、占用内存多
    【Git教程】如何清除git仓库的所有提交记录,成为一个新的干净仓库
    mount --bind和硬连接的区别
    彻底删除 Windows Defender
  • 原文地址:https://www.cnblogs.com/zhaoyingzhen/p/15210043.html
Copyright © 2011-2022 走看看