使用render实现v-model与多个slot分发

使用render函数实现表格与form表单之间的双向绑定以及表格中使用slot分发(多个slot,分发不同的内容)。

主要思路

通过props给表单组件的value进行赋值,之后通过change、blur等元素监听事件,进行取值,然后通过表格当前行索引对表格相应元素进行赋值。这样就完成了一个数据的双向绑定了。
<!–more–>

<div class=”reference”>我这边使用的是
ivewUI组件库</div>

 <!-- 表格代码 -->
 <Table highlight-row :columns="columns3" border :data="data1" size="small" ref="table"></Table>

在表格中对一个input实现双向绑定

{
  title: '姓名',
  key: 'name',
  render: (h, params) => {
    let self = this;
    return h('div', [
      h('Input', {
        props: {
          placeholder: "请输入....",
          value:params.row.name
        },
        'on': {
          'on-blur':() => {
            self.data1[params.index].name = event.target.value
          }
        },
      }),
      h('p',{
        style: {
          color: 'red',
          display: self.data1[params.index].name === "" ? '' : 'none'
        }
      },'请输入你的名字....')
    ]);
  }
}

在表格中对一个select实现双向绑定

{
  title: '性别',
  key: 'sex',
  render: (h, params) => {
    let self = this;
    const sexList = [
      {name:'男',value:1},
      {name:'女',value:2}
    ]
    return h('Select',{
      props:{
        value:params.row.sex
      },
      on :{
        'on-change' : (val) => {
          self.data1[params.index].sex = val;
        }
      }
    },sexList.map(item => {
        return h('Option',{
          props:{
            value: item.value,
          }
        },item.name)
      })
    )
  }
}

在表格中对一个switch实现双向绑定,外加slot

{
  title: 'switch开关slot实现',
  key: 'switchSlot', 
  renderHeader(h, params) {
    return h('Tooltip', {
      props: {
        placement: 'right',
        content: 'switch开关'
      }
    },'switch开关slot实现')
  },
  render: (h, params) => {
    let self = this;
    const switchList = [
      {
        slot: 'open',
        name: '打开'
      },
      {
        slot: 'close',
        name: '关闭'
      }
    ]
    return h('i-switch',{
      props: {
        size: 'large',
        value: params.row.switchSlot
      },
      on: {
        'on-change' : (val) =>{
          self.data1[params.index].switchSlot = val;
        }
      }
    // 这样我们就可以在表格中完美的实现多个slot分发了
    },switchList.map(item => {
      return h('span',{
        slot:item.slot
      },item.name)
    }))
  }
}

注意

对表格数据进行双向绑定时,不建议直接更改源数据源,可以copy出一份临时数据源,在做相应修改操作时对临时数据源进行更改,这样可以大大减少对dom的渲染在需要的时候再将临时数据源提交到主数据源就可以了。

结尾

如果觉得render写起来很烦的话,可以使用jsx,会大大减少代码量0.0
源码地址

    原文作者:Black_晨
    原文地址: https://segmentfault.com/a/1190000014569645
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞