美文网首页vue
vue 自定义组件 v-model 用法

vue 自定义组件 v-model 用法

作者: _不惧岁月长 | 来源:发表于2020-04-17 17:22 被阅读0次

    最近解锁一个vue新用法,自定义组件 v-model,记录下来,加深印象,也希望对有需要的同学一些启发.

    //父组件代码
    <template>
      <div>
        <el-row  class="padding1vw">
          <mt>自定义组件 v-model 用法</mt>
          <el-col :xs="24" :sm="24" :md="24" :lg="24" class="padding1vw">
            父组件:{{inputValue}}
          </el-col>
          <el-col :xs="24" :sm="24" :md="24" :lg="24"  class="padding1vw">
            <childmodelroutine v-model="inputValue"></childmodelroutine>
          </el-col>
        </el-row>
      </div>
    </template>
    
    <script>
    export default {
      mixins: [require("@/mymixins").default],
      name: "custommodelparent",
      data() {
        return {
          inputValue:'文本框来自父组件的问候,我是你爸爸,你是我儿子一号',
        };
      },
      components: {
        childmodelroutine: () => import("./childmodel/childmodelroutine"),
      },
    };
    </script>
    
    父组件定义好需要传给子组件的值
    //子组件代码
    <template>
      <div>
        <el-row>
          <el-form>
            <el-form-item>
              <mdb tooltip :disabledTime="0" @click="returnFather" :disabled="disabled">{{changemsg1}}</mdb>
            </el-form-item>
            <el-form-item>
              子组件:<el-input v-model="inputValue" placeholder="请输入内容" size="small"></el-input>
            </el-form-item>
          </el-form>
        </el-row>
      </div>
    </template>
    
    <script>
    export default {
      mixins: [require("@/mymixins").default],
      name: "custommodelparent",
      data() {
        return {
          changemsg1: "点击儿子一号会修改爸爸的值",
          disabled: false,
        };
      },
      props: ["inputValue"],
      model: {
        prop: "inputValue",
        event: "returnFather"
      },
      methods: {
        returnFather() {
          this.$emit("returnFather", "收到收到,我是儿子一号,我已经将爸爸的值修改");
        }
      }
    };
    </script>
    

    子组件中,先用props接收,model中属性prop为父组件传过来的值,event为回应父组件的方法,此时父组件v-model绑定值,无需方法接收,能实现直接通信,props接收值名字不一定要与父组件一致.

    官方有提到一种简单的写法:默认情况下,一个组件上的 v-model 会把 value 用作 prop 且把 input 用作 event。修改一下代码,实现相同的效果.

    //附上子组件代码
    <template>
      <div>
        <el-row>
          <el-form>
            <el-form-item>
              <mdb tooltip :disabledTime="0" @click="returnFather" :disabled="disabled">{{changemsg1}}</mdb>
            </el-form-item>
            <el-form-item>
             子组件: <el-input v-model="value" placeholder="请输入内容" size="small"></el-input>
            </el-form-item>
          </el-form>
        </el-row>
      </div>
    </template>
    
    <script>
    export default {
      mixins: [require("@/mymixins").default],
      name: "custommodelparent",
      data() {
        return {
          changemsg1: "点击儿子一号会修改爸爸的值",
          disabled: false,
        };
      },
      //默认的 'value' && 'input' 事件去处理,如果用原生事件的,甚至连model属性也可以省去。
      // value 为默认父组件传过来的值 input 为传递父组件的事件  代替 model 中的prop 和event
      props: ["value"],
      // model: {
      //   prop: "inputval",
      //   event: "returnFather"
      // },
      methods: {
        returnFather() {
          this.$emit("input", "收到收到,我是儿子一号,我已经将爸爸的值修改")
        }
      }
    };
    </script>
    

    效果图

    修改之前
    image.png
    修改之后
    image.png

    父子组件的值都改变了,实现了组件直接的v-model绑定

    附上官网地址:https://cn.vuejs.org/v2/guide/components-custom-events.html

    相关文章

      网友评论

        本文标题:vue 自定义组件 v-model 用法

        本文链接:https://www.haomeiwen.com/subject/jxyyvhtx.html