Vue+iview封装自定义输入组件

Vue封装自定义组件就和上篇的React有些许不同。

众所周知,vue的数据是单向流动的,使用v-model可以完成双向绑定

首先我们一样的先写一个vue的父组件

再写一个子组件

在这里我们可以看到,父组件中子组件使用v-model双向绑定数据,因为content是由上层组件传过来,依照vue的规范,props是不能被更改的,所以我们需要手动写一个v-model(或者使用计算属性的get,set)

v-model其实就是值与事件的语法糖

所以v-model=''value0'可以直接写成 :value='value0',@on-change=''value1=>value0=value1'

所以我们在子组件写的Input输入框其实就是将value绑定在父组件的content,而改变值得方法是调用父组件去改变,就不会影响到单向数据流的规范。

其实很多人也发现了,如果上层父组件穿过来的content是一个对象,这里就可以使用v-model去绑定这个对象中的某一个值,vue也不会报错,但这样不符合规范,更会影响代码的冗杂度。

我们现在看一下界面

在子组件中输入内容

父组件data中的值已经被改变。

以下是源码

App.vue

<template>
  <div id="app">
      我是父组件,我的内容是:{{content||"无"}}
      <Child v-model="content"/>
  </div>
</template>

<script>
import Child from './components/Child';
export default {
  name: 'app',
    components:{Child},
  data(){
      return {
          content:null
      }
  }
}
</script>

<style>
 #app{
     text-align: center;
 }
</style>

Child.vue

<template>
   <div>
       我是子组件,我有一个输入框:
       <Input :value="content" @on-change="(e)=>$emit('change',e.target.value)" style="width: 200px"/>
   </div>
</template>

<script>
    export default {
        name: "Child",
        model: {
            prop: 'value',
            event: 'change'
        },
        props:["content"]
    }
</script>

<style scoped>

</style>

如果您觉得此博客有错误或改进之处,请留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值