iview-table组件嵌套input select数据无法双向绑定解决

目录
  • 一、前言
  • 二、问题描述
  • 三、解决办法
    • 1.基础数据表格
    • 2.树形数据表格
  • 四、后记

一、前言

本篇主要介绍关于iview-ui组件库中的table表格组件嵌套input组件,数据无法及时更新问题的解决办法。

二、问题描述

在我们开发的过程中,经常会遇到需要在表格内操作数据的情况,但是在vue2中,双向绑定的值必须是在data中声明的变量,然而我们在table中展示的每一行数据,通常都是使用的scope中的row去获取的当前行数据,但是row却并没有在data中声明,这样就出现了,无法实现数据的双向绑定。

三、解决办法

因为在使用场景中,有时候我们用的一维的表格,还有一种就是树状结构的表格,所以这里我们分两种情况说。

1.基础数据表格

第一种就是一维数组的基础型数据的table展示。如下图

这种情况,为了实现数据的双向绑定,我们可以这么做,代码如下

<template>
    <Table :columns="columns" :data="tableData">
        <template #name="{ row, index }">
          <Input v-model="tableData[index].name" />
        </template>
        <template #desc="{ row, index }">
          <Input v-model="tableData[index].desc" />
        </template>
        <template #action="{ row, index }">
          <Button type="text">删除</Button>
        </template>
    </Table>
</template>
export default {
    data () {
        return {
            tableData: []
            columns: [
                {
                  type: 'index',
                  title: '序号',
                  width: 80,
                  align: 'center'
                },
                {
                  title: '参数名称',
                  slot: 'name'
                },
                {
                  title: '参数描述',
                  slot: 'desc'
                },
                {
                  title: '操作',
                  slot: 'action',
                  width: 120
                }
            ]
        }
    }
}

这种基础型数据结构的表格,我们就可以直接利用tableData[index]来替代row,因为tableData在data中声明了,所以这时候,input上绑定的数据,是可以实现双向绑定的。

2.树形数据表格

第二种树形结构的数据表格,展示情况如下图所示

这种情况,我们就不能用上面的方法了,因为我们不能通过index去获取更多维深度的数据了,因此这里我们可以通过事件监听的方式,去查询当前改变数据是哪个,利用树型数据的唯一_key值,去这个绑定数组tabelData中修改对应的值,代码如下

<template>
    <Table row-key="_key" :columns="columns" :data="tableData">
      <template #label="{ row }">
        <Input v-model="row.label" @on-change="updateTableData(row, 'label')" />
      </template>
      <template #componentName="{ row }">
        <Select v-model="row.componentName" transfer @on-change="updateTableData(row, 'componentName')">
          <Option v-for="item in componentList" :value="item.value" :key="item.value">{{ item.label }}</Option>
        </Select>
      </template>
      <template #required="{ row }">
        <Checkbox v-model="row.required" @on-change="updateTableData(row, 'required')" />
      </template>
      <template #hidden="{ row }">
        <Checkbox v-model="row.hidden" @on-change="updateTableData(row, 'hidden')" />
      </template>
      <template #defaultValue="{ row }">
        <Input v-model="row.defaultValue" @on-change="updateTableData(row, 'defaultValue')" />
      </template>
    </Table>
</template>
export default {
    data () {
        return {
            tableData: [],
            componentList: [
                {
                  value: 'TextField',
                  label: '文本组件'
                }
            ],
            columns: [
                {
                  title: '字段名称',
                  key: 'name',
                  tree: true
                },
                {
                  title: '显示名称',
                  slot: 'label',
                },
                {
                  title: '字段类型',
                  slot: 'componentName'
                },
                {
                  title: '必填',
                  slot: 'required',
                  width: 60
                },
                {
                  title: '隐藏',
                  slot: 'hidden',
                  width: 60
                },
                {
                  title: '默认值 ',
                  slot: 'defaultValue'
                }
            ]
        }
    },
    methods: {
        // 找到对应值递归---手动更新
        repeatDoit (list, row , key) {
          list.forEach(item => {
              if (item._key === row._key) {
                item[key] = row[key]
              } else {
                if (item.children && item.children.length) {
                  this.repeatDoit(item.children, row , key)
                }
              }
          })
        },
        // 手动更新表格中的数据==body
        updateTableData (row, key) {
          this.repeatDoit(this.tableData, row, key)
          console.log('this.tableData ====', this.tableData)
        }
    }
}

这里我们通过监听表单组件的事件,然后通过树形结构的唯一_key值,去修改data中声明tableData数组变量,从而实现数据的更新。

四、后记

以上我们就实现了解决iview-table组件嵌套input、select数据无法双向绑定问题。另外还有一种解决方法,是使用render去构造表格,我不太喜欢那种写法,所以这里就不说了,更多关于iview table数据双向绑定的资料请关注我们其它相关文章!

(0)

相关推荐

  • Input系统之InputReader概要性实例分析

    目录 InputReader 的创建 EventHub 创建过程如下 InputReader 的运行 EventHub 提供事件 InputReader 的创建 从 InputManagerService: 创建与启动 可知,Input 系统的主要功能,主要集中在 native 层,并且Input 系统的 native 层又包含 InputReader, InputClassifer, InputDispatcher 三个子模块.本文来分析 InputReader 从创建到启动的基本流程,为后续

  • Input系统之InputReader处理合成事件详解

    目录 正文 生成合成事件 加载并解析输入设备的配置 InputReader 处理合成事件 创建与配置 InputDevice 配置基本参数 配置坐标系 配置 Surface 小结 正文 Input系统: InputReader 概要性分析 把 InputReader 的事件分为了两类,一类是合成事件,例如设备的增.删事件,另一类是元输入事件,也就是操作设备产生的事件,例如手指在触摸屏上滑动. 本文承接前文,以设备的扫描过程为例,分析合成事件的产生与处理过程.虽然设备的扫描过程只会生成部分合成事件

  • Flutter使用 input chip 标签组件示例详解

    目录 前言 正文 类构造 属性 如何在 Dart 文件中实现代码 全部代码 结论 前言 这里有一些拥有属性的 chip,其中之一就是 input chip.input chip 通常用于以保守的结构处理客户端输入或向客户端提供想法.除了 label 和 avtar 之外,input chip 还可以有一个删除图标.在 Flutter 中,您可以利用 InputChip widget 制作这种 chip. InputChip 是一个 material widget ,它以保守的结构处理令人难以置信

  • InputStream数据结构示例解析

    目录 正文 struct InputStream数据结构定义 各个字段的解析 正文 struct InputStream 是单个输入流的管理器.是由 add_input_stream() 函数申请内存,以及赋值 InputStream 的各个字段的. 而 input_streams 数组是一个全局变量,包含了所有输入文件里面的所有输入流. nputStream **input_streams = NULL; int nb_input_streams = 0; 你在二次开发 ffmpeg.exe 

  • 可定制react18 input otp 一次性密码输入组件

    目录 正文 主要特点 基本用法 1.安装和导入 2.将OtpInput组件添加到应用程序中 3.所有默认的道具 预览 正文 一个完全可定制的.用于React驱动的应用程序的一次性密码(OTP).电话号码和pin码输入组件. 主要特点 它在React和ionic应用程序上都很好用.在手机上也能正常工作. 你可以用inputNum道具只指定数字输入. 在网页和手机上与剪贴板粘贴功能完美配合. npm上唯一支持'enter'键提交的OTP输入包. 在Android上没有OTP粘贴问题. 在iOS ch

  • Android开发InputManagerService创建与启动流程

    目录 前言 启动流程 创建输入系统 启动输入系统 输入系统就绪 结束 前言 之前写过几篇关于输入系统的文章,但是还没有写完,后来由于工作的变动,这个事情就一直耽搁了.而现在,在工作中,遇到输入系统相关的事情也越来越多,其中有一个非常有意思的需求,因此是时候继续分析 InputManagerService. InputManagerService 系统文章,基于 Android 12 进行分析. 本文将以 IMS 简称 InputManagerService. 启动流程 InputManagerS

  • iview-table组件嵌套input select数据无法双向绑定解决

    目录 一.前言 二.问题描述 三.解决办法 1.基础数据表格 2.树形数据表格 四.后记 一.前言 本篇主要介绍关于iview-ui组件库中的table表格组件嵌套input组件,数据无法及时更新问题的解决办法. 二.问题描述 在我们开发的过程中,经常会遇到需要在表格内操作数据的情况,但是在vue2中,双向绑定的值必须是在data中声明的变量,然而我们在table中展示的每一行数据,通常都是使用的scope中的row去获取的当前行数据,但是row却并没有在data中声明,这样就出现了,无法实现数

  • Iview Table组件中各种组件扩展的使用

    一.Iview Table 组件 多选框选中和禁选设置 Table添加多选框 通过给 columns 数据设置一项,指定  type: 'selection' ,即可自动开启多选功能. 正确使用好以下事件,可以达到需要的效果: @on-select ,选中某一项触发,返回值为  selection  和  row ,分别为已选项和刚选择的项. @on-select-all ,点击全选时触发,返回值为  selection ,已选项. @on-selection-change ,只要选中项发生变化

  • 解决iview table组件里的 固定列 表格不自适应的问题

    当在使用iview Table组件里固定列功能时 出现表格不自适应宽度问题 具体如下 解决这个bug 很简单 把组件里的 width 改为 minWidth 即可 columns: [ { title: '账户名', key: 'accountName', fixed: 'left', minWidth: 150 }, { title: '订阅名称', key: 'subscriptionName', minWidth:140 }, { title: '订阅ID', key: 'subscrip

  • Antd的Table组件嵌套Table以及选择框联动操作

    一.需求 在使用Table组件嵌套Table时,父子Table的选择框需要联动,即父Table选中,该行下的子Table需要全选中,某一个子Table全部选中,则该子Table所在的父Table那一行也需要选中. 二.Table的rowSelection配置 父子Table联动,就不能使用OnChange,需要使用OnSelect以及OnSelectAll手动配置. selectedRowKeys:指定选中项的key数组 OnSelect:手动选择/取消选择某行的回调 OnSelect(reco

  • 解决iView Table组件宽度只变大不变小的问题

    示例: <Table class="my-table"></Table> 打开开发者工具其实你可以发现iView给table标签的宽度加上了一个明确的宽度值,而且在父元素变小的时候这个值并没有相应地变小,所以才会导致的iView Table组件只会变大不会变小. 那么我们就可以根据这个原因才决定解决方案 1.给Table组件的table标签设置一个important的width .my-table table { width: 100% !important;

  • Vue2.0实现组件数据的双向绑定问题

    通过上一节的学习,我们了解到了在Vue的组件中数据传递: prop 向下传递,事件向上传递 .意思是父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息.但Vue中, props 是单向数据绑定,虽然在Vue 1.0版本中,通过 .sync 能实现双向数据绑定.但 .sync 在几个版本中被移除,尽管在2.3版本重新引入 .sync 修饰符,可这次引入只是作为一个编译时的语法糖存在.如果直接使用 .sync 修饰符来做双向数据绑定,会报警告信息.那么我们如何在组件中实现双向数据

  • angular4自定义组件非input元素实现ngModel双向数据绑定的方法

    在angular里我们一般都是给input元素添加[(ngModel)]="value"实现数据双向绑定,如果想实现自定义的组件上实现ngModel双向数据绑定应该怎么办呐... 网上找了一下,没看懂记录一下. 场景:组件能获取父组件通过ngModel绑定的值,能通过ngModel改变父组件对应的数据.如下代码: <app-child [(ngModel])="appData"></app-child> 1.先贴出效果图: 2.下面是app-

  • VUE-Table上绑定Input通过render实现双向绑定数据的示例

    效果 HTML的Table <Card> <div ref="print" > <Table width="100%" height="500" size="small" :columns="columns7" :stripe="true" :data="data" border ></Table> </div&g

  • Vue.js第一天学习笔记(数据的双向绑定、常用指令)

    数据的双向绑定(ES6写法) 效果: 没有改变 input 框里面的值时: 将input 框里面的值清空时: 重新给  input 框输入  豆豆 后页面中  span  里绑定{{testData.name}}的值随着 input 框值的变化而变化. 在Vue.js中可以使用v-model指令在表单元素上创建双向数据绑定.并且v-model指令只能用于:<input>.<select>.<textarea>这三种标签. <template> <div

  • 使用Vue.js实现数据的双向绑定

    目录 如何用Vue.js实现数据的双向绑定? 1. 理解双向绑定 2. 使用v-model指令 3. 使用自定义组件实现双向绑定 4. 数据劫持 5. 模板引擎 6.Object.defineProperty()详解 如何用Vue.js实现数据的双向绑定? 在Vue.js中,双向数据绑定是一项非常强大的功能,它能够使数据和视图之间保持同步,让开发者更加方便地操作数据.在本文中,我们将介绍如何用Vue.js实现数据的双向绑定. 1. 理解双向绑定 首先,我们需要了解双向绑定的原理.在Vue.js中

随机推荐