一个巧妙的方法实现elementUI的table的行选中

  问题背景:点击上面的框,选中下面对象的行数据

  刚开始考虑使用的是table的事件:toggleRowSelection,但是发现一个奇怪的现象

<div v-if="orderData.length > 0">
    <h5>审核意见:</h5>
    <div class="review bg_gray" v-for="(item,index) in orderData">
        <div class="content" v-if="item.review_data">
            <span @click="toggleSelection(0)">
            <el-checkbox v-model="checkList[item.order_id]"></el-checkbox>
            </span>
            <span>{{item.review_data}}</span>
        </div>
    </div>
</div>

<el-button @click="toggleSelection(0)">选中状态</el-button>
toggleSelection(index){
    this.$refs.order.toggleRowSelection(this.orderData[index]);
}

  上面2个方法,一模一样,但是只有第二个能选中,第一个却无效。一直想不明白为什么。

  所以考虑换一种方式:

  直接看代码吧:我在表格里面加了一列checkbox,然后让上面的checkbox和表格里的checkbox的v-model指向同一数据,那么这样上面变化时,下面也会变化,下面变化,上面也跟着变化,同步响应。

  当然如果想下面表格里的chexkbox不能点选,那么就要加上:onclick="return false;",这也是一个技巧吧

<template>
<el-main>
    <div v-if="orderData.length > 0">
        <h5>审核意见:</h5>
        <div class="review bg_gray" v-for="(item,index) in orderData">
            <div class="content" v-if="item.review_data">
                <el-checkbox v-model="checkList[item.order_id]"></el-checkbox>
                <span>{{item.review_data}}</span>
            </div>
        </div>
    </div>

    <h5>推荐服务:</h5>
    <el-table
    ref="order"
    :data="orderData"
    @selection-change="handleSelectionChange">
        <el-table-column width="80">
            <template slot-scope="scope">
                <el-checkbox onclick="return false;" v-model="checkList[scope.row.order_id]"></el-checkbox>
            </template>
        </el-table-column>
        <el-table-column prop="service_class" label="服务类别"></el-table-column>
        <el-table-column prop="service_name" label="服务名称"></el-table-column>
        <el-table-column prop="service_price" label="服务价格"></el-table-column>
      </el-table>

      <div class="bg_gray sum" v-if="sum > 0">合计:{{sum}}</div>
      <div class="btn_submit" v-if="userInfo && userInfo.roleName === ‘user‘">
        <el-button @click="submitOrders(‘orders‘)" type="primary" plain>提交订单</el-button>
        <router-link :to="‘/standard1‘">
            <el-button type="danger">选择年付服务更实惠</el-button>
        </router-link>
    </div>
</el-main>
</template>
<script type="ecmascript-6">
import {getReviewApi,reviewSaveApi} from ‘@/apis‘
import {mapGetters} from ‘vuex‘
export default {
    data(){
        return {
            orderData:[],
            sum:0,
            orders:[],
            checkList:{}
        }
    },
    computed:{
        ...mapGetters([‘reportInfo‘,‘userInfo‘])
    },
    methods:{
        fetchData(){
            getReviewApi(this.reportInfo.report_id).then((res) => {
                if(res.status === 200){
                    this.orderData = res.data
                }
            })
        },
        handleSelectionChange(rows){
            let _sum = 0;
            this.checkList = {}
            rows.forEach(item => {
                _sum += item.service_price
                this.checkList[item.order_id] = ‘icon-choice‘
            })
            this.sum = _sum;
            this.orders = rows;
        },
        submitOrders(type){
            if(this[type].length === 0){
                this.$message({
                    message:‘请选择订单‘,
                    type:‘error‘
                })
                return false
            }
            reviewSaveApi(‘choosePreorders‘,this[type]).then(res => {
                if(res.status === 200){
                    this.fetchData()
                    this.$router.push(‘/order‘)
                    this.$message({
                        message:‘订单提交成功‘,
                        type:‘success‘
                    })
                }
            })
        }
    },
    mounted(){
        this.fetchData()
    }
}
</script>
<style scoped lang="stylus" rel="stylesheet">
@import ‘../../assets/css/index.styl‘
.review{
    white-space pre-wrap
    padding 10px 20px
    font-size 14px
}
.sum{
    font-size 14px
    text-align right
}
</style>

原文地址:https://www.cnblogs.com/goloving/p/9198410.html

时间: 2024-08-02 10:21:22

一个巧妙的方法实现elementUI的table的行选中的相关文章

排序含有数字的字符串:一个巧妙地方法

using System; using System.Collections.Generic; class Program { static void Main(string[] args) { string[] floors ={ "第3楼", "第2楼", "第11楼" }; Array.Sort<string>(floors, Factory.Comparer); foreach (string s in floors) Con

排序含有数字的字符串:一个巧妙地方法【转】

using System;using System.Collections.Generic; class Program{ static void Main(string[] args) { string[] floors ={ "第3楼", "第2楼", "第11楼" }; Array.Sort<string>(floors, Factory.Comparer); foreach (string s in floors) Conso

ElementUI Table 首行固定

本文地址: https://www.cnblogs.com/veinyin/p/12101047.html 需求描述:首行固定,吸附在表头下,数据多时其他行可以纵向滚动 方案一  两个表格拼凑 第一个表格展示头部和固定行 第二个表格展示其它数据 示意图如下 适用场景:仅横向 纵向均无滚动条时可用 若有横向滚动条,两个表格的滚动条是分开的,会出现滚动A  B不动,或滚动B A不动的情况,Windows下会展示两个横向滚动条,不美观 若有纵向滚动条,在Windows下滚动条是默认有宽度的,滚动条的宽

定义一个包含增强方法的javaBean(最终增强)

使用Schema 1.AroundLogger类 1 //定义一个包含增强方法的javaBean 2 public class AroundLogger{ 3 //注解方式的环绕增强处理 4 private static final Logger log = Logger.getLogger(AroundLogger.class); 5 public Object aroundLogger(ProceedingJoinPoint jp){ 6 log.info("a调用"+jp.get

关于cannot find module &#39;xxxx’的一个可能解决方法。

关于cannot find module 'xxxx'的一个可能解决方法. 由于学习angular2,想单独学习一下typescript下angular2使用的'rxjs'是怎么使用的,我用npm自己安装了rxjs,并使用了如下语句 import { Observable } from 'rxjs'; 报错如下: cannot find module 'rxjs', 但是同样的语句在angular/cli生成的angular项目下是不报错的,我找了半天,各种解决方法都不适用于我遇到的情况.由于这

C#1(.net和C#的关系、VS与.net的对应关系、VS2012常用的几种应用程序、C#定义一个类的方法、类页面内容的解释、定义Person的类、调用Person类的方法、命名规范、数值类型)

1..net和C#的关系 .net是一个开发平台,C#是应用在.net平台上的一种语言.   2.VS与.net的对应关系  3.VS2012常用的几种应用程序 第一种是Windows窗体应用程序,也即是我们常用的C/S端的应用软件: 第二种是控制台应用程序,主要是用来学习调试C#代码的(老师上课应用的模式): 第三种是空Web应用程序,建立空的网页模式,B/S模式: 第四种是Web 窗体应用程序,建立后会生成一些常用的网页组件和功能,例如JS.image等,也是B/S模式. 4.C#定义一个类

C#中关闭第一个Form窗口,打开另一个新窗口方法

很多同学问怎么关闭一个FORM打开另一个新Form.这个问题最多的是在做登录验证时,使用第一个登录窗 登录成功后要关闭自己,然后打开新窗显示.没想到这个问题在.Net还成了问题,不过依然有很多方法解决. 典型的 Form1 f = new Form1(); f.Show(); this.Close(); 最后的关闭时把整个程序都关闭了 1隐藏法,原理就是把旧窗口隐藏掉,再打开新窗口. //新建一个NewForm窗口(NewForm是自己定义的Form) NewForm fm=new NewFor

在Linux中定时执行一个程序的方法之at命令

/*********************************************************************  * Author  : Samson  * Date    : 04/29/2014  * Test platform:  *              3.11.0-12-generic #19-Ubuntu  *              GNU bash, version 4.2.45  * ****************************

Shell脚本中调用另外一个脚本的方法

在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件,经常用的方法有:./my.sh 或 source my.sh 或 . my.sh:这三种方法有什么不同呢?我们先来了解一下在一个shell脚本中如何调用另外一个shell脚本,其方法有 fork    exec    source. 1.fork  ( /directory/script.sh) : 如果shell中包含执行命令,那么子命令并不影响父级的命令,在子命令执行完后再执行父级命令.子级的环境变量不会影响到父