$set在vue中的应用案例

vue中this.$set在官方API中是这样说的:

Vue.set( target, propertyName/index, value )

参数

{Object | Array} target

{string | number} propertyName/index

{any} value

返回值:设置的值。

用法:向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新属性,因为 Vue 无法探测普通的新增属性 (比如 this.myObject.newProperty = 'hi')

-------看不懂?说实话,遇到问题之前自己也不懂,耐心接着往下看

在vue中,为了解决动态渲染数据问题,使用数组作为唯一标识,以下案例只使用了一个disable,在实际应用中可以同时设置多个变量用来动态渲染和用作区分标识。话不多说,看组件demo,用的element-ui框架。

<template>
  <div class="demo">
    <h1>vue中$set应用案例</h1>
    <div class="demo1">
      <el-table :data="tabdata" style="width: 100%" :row-class-name="tableRowClassName">
        <el-table-column prop="name" label="姓名" width="180"></el-table-column>
        <el-table-column prop="age" label="年龄" width="180"></el-table-column>
        <el-table-column prop="gender" label="性别"></el-table-column>
      </el-table>
    </div>
    <div class="demo2">
      <ul>
        <li v-for="(item, index) in tabdata" :key="index">
          <div>
            <div class="front">姓名:</div>
            <el-input size="mini" v-model="item.name" :disabled="!disabled[index]"></el-input>
          </div>
          <div>
            <div class="front">年龄:</div>
            <el-input size="mini" v-model="item.age" :disabled="!disabled[index]"></el-input>
          </div>
          <div>
            <div class="front">性别:</div>
            <el-input size="mini" v-model="item.gender" :disabled="!disabled[index]"></el-input>
          </div>
          <div>
            <el-button size="mini" type="primary" v-if="!disabled[index]" @click="edit(index)">修改</el-button>
            <el-button
              size="mini"
              type="success"
              v-if="disabled[index]"
              @click="sub(index,item.name,item.age,item.gender)"
            >确定</el-button>
          </div>
        </li>
      </ul>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      disabled: [],
      tabdata: [
        {
          name: "陈萍萍",
          age: "48",
          gender: "男"
        },
        {
          name: "范思哲",
          age: "12",
          gender: "男"
        },
        {
          name: "范若若",
          age: "16",
          gender: "女"
        },
        {
          name: "范闲",
          age: "18",
          gender: "男"
        },
        {
          name: "言冰云",
          age: "18",
          gender: "男"
        },
        {
          name: "司理理",
          age: "17",
          gender: "女"
        },
        {
          name: "林婉儿",
          age: "17",
          gender: "女"
        },
        {
          name: "圣女",
          age: "18",
          gender: "女"
        }
      ]
    };
  },
  methods: {
   
    edit(index) {
      //修改操作状态
      this.$set(this.disabled, index, !this.disabled[index]);
    },
    sub(index, name, age, gender) {
      //获取已经修改的值
      console.log(index, name, age, gender);
      this.$set(this.disabled, index, !this.disabled[index]);
    },
    tableRowClassName({ row, rowIndex }) {
      if (rowIndex === 1) {
        return "warning-row";
      } else if (rowIndex === 3) {
        return "success-row";
      }
      return "";
    }
  }
};
</script>
<style lang="scss">
#demo {
  width: 100%;
  height: 100%;
  float: left;
}
.demo1 {
  float: left;
  width: 40%;
  margin: 0 auto;
}
.demo2 {
  float: left;
  width: 40%;
  margin: 0 auto;
  ul {
    list-style: none;
    line-height: 20px;
    li {
      width: 240px;
      margin: 20px;
      padding-bottom: 20px;
      border-bottom: 1px solid #ff6600;
      float: left;
      input {
        float: left;
      }

      .front {
        width: 60px;
        float: left;
      }
    }
  }
}
.el-input {
  float: left;
  width: 180px;
}
</style>

 

效果展示:

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值