vue 向请求数据添加新字段,view层实时渲染

一、需求

地址选择列表

  • 默认地址置顶(字段:isDefult,只有一条)
  • 默认勾选默认地址
  • 只能勾选一条地址,且勾选地址要显示成打勾
  • 勾选好地址后,点击确定按钮,要发送请求
    ps. 图中的true和false 只是为了方便查看实时数据;

二、需求实现

先上一个不大简便的方法,组长说用‘医院和科室’的选择思路来做更好,后续优化后再补。

大致思路:

1、向请求来的数据里,手动新增一个字段 ‘check’ ,因为默认地址要默认打勾,且默认的字段‘isDefult’也是一个Boolean值,所以只需要让check的初始值等于idDefult的值就可以。
2、通过isdeful的值,对数组进行排序。
3、在data里设置对象defultForm:{},,初始值为默认地址的值,之后点击哪条地址,defultForm就变成哪条地址的值,点击确定按钮后执行的请求以其为参数。

三、所遇问题

我定义了一个公共函数,请求地址列表数据,返回一个this.commpatAddressList = list

    async mixin_get_commpat_address_list(){
      let {code,list} = await this.$http('smarthos.user.pat.address.list');
      if(code==0){
        return this.commpatAddressList = list
        })
      }
    },

项目页面组件

<template>
<div>
  <v-header>
    <span @click="toAddAddress" slot="right">新建地址</span>
    选择送药地址
  </v-header>
    <div>
        <choose-item v-for="(o,i) in commpatAddressList" :key="i" 
:info="o" :index="i"  @checkAdd="checkAdd"></choose-item>
    </div>
  <button v-if="commpatAddressList && commpatAddressList.length>0" @click="addShip" >
  确定寄到该地址</button>
</div>
</template>

<script>
export default {
data(){
        return{
          commpatAddressList:[], //传给子组件的地址数组
          defultForm:{}, //确认按钮的http请求参数
        }
      },
  methods:{
            
    // 获取收货地址列表
        async getAddressList(){
          await this.mixin_get_commpat_address_list();
        },

    // 默认地址置顶,每条数据都添加check字段
    //这种遍历太麻烦,后面的优化的方法
        sortAddressList(){
          let newAddList=[];
          let defult = [];
          for(let obj of this.commpatAddressList){
            if (obj.isDefault==true){
              obj.check = true;
              defult = obj;
              this.defultForm = obj;
            }else{
              obj.check = false;
              newAddList.push(obj);
            }
          }
          newAddList.unshift(defult);
          this.commpatAddressList= newAddList;
        },

      //点击地址时,子组件触发的页面组件函数
      //将地址数组中所有数据的check字段都改为false,
      //子组件返回的index数字所对应的那条数据的check字段值变为true
       checkAdd(info, index){
          let newAddList=[];
          for(let obj of this.commpatAddressList){
            obj.check=false;
            newAddList.push(obj);
          }
          newAddList[index].check = true;
          this.commpatAddressList.splice(0);
          //尝试了两种this.$set方式,但是都没有渲染
         /* let news = newAddList[index];
          news.check = true;
          this.$set(this.commpatAddressList, index, news);*/

          this.defultForm = info;
          this.commpatAddressList=[].concat(newAddList);
          //this.$set(this.$data, 'commpatAddressList', newAddList);
        },
  }
}
</script>

项目子组件

<template>
<div @click="tocheckAdd">
  <div >
    <font v-if="info.check">&#xe60b;</font>
    <font v-else >&#xe602;</font>
  </div>
  <div >
    <p ><span class="flex0 ziti">{{info.name}}</span><span>{{info.mobile}}</span></p>
    <p >{{info.areaName}},{{info.address}}</p>
  </div>
</div>
</template>

<script>
    export default {
      name: "choose-item",

      props:{
        info:{
            type:Object,
        },
        index:{
            type:Number,
        }
      },
      methods:{
        tocheckAdd(){
          this.$emit('checkAdd', this.info, this.index)
        },
      },
    }
</script>

但是这样运行之后,点击地址,check的确发生了改变,但是页面上打勾选项一直没有反应;

然后试了
1、watch函数、
2、在addCheck里采用this.$set的方法修改check值,
3、采用splice方式归零commpatAddressList数组,
4、 同步传递数据 :info.sync="o",点击地址
仍旧没有反应;

最后找到了最初的公共的请求函数,问题就出在 return this.commpatAddressList = list 里,此处的 this.commpatAddressList 意味着初始化了组件的数据 ‘this.commpatAddressList’,然后在父组件中,再添加check,check也只存在于js层,而不受vue的承认。

因为 Vue 是通过递归遍历初始数据中的所有属性,并用 Object.defineProperty 把它们转化为 getter 和 setter 来实现数据观察的。如果一个属性在实例创建时不存在于初始数据中,那么 Vue 就没有办法观察这个属性了。——【Vue官方文档】

所以解决办法是,在公共的请求函数里,就加上check字段

    async mixin_get_commpat_address_list(){
      let {code,list} = await this.$http('smarthos.user.pat.address.list');
      if(code==0){
        //代替了遍历数组添加check字段 以及 添加sort字段方便排序
        this.commpatAddressList = list.map(r=>{
          r.check=r.isDefault; //默认地址默认打勾
          r.sort=r.isDefault?1:0;  //idDefult为true就为1,否则为0
          return  r;
        }).sort((a,b)=>{  //根据sort字段将数组降序排列,默认字段置顶
          return b.sort-a.sort;
        });
      }
    },
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,044评论 0 29
  • 万里清幽 雾霾浸在心头 风云难觅缘由 不过一时念旧 引得天幕愁愁 快跑 哗啦雨啾 慢着 我能在雨缝中走
    岫蓦阅读 311评论 4 2
  • 鬼知道刚刚我经历了什么! 从商场出来,在门口遇到一个在冷风中颤抖的眼镜推销员,追着我跑让我给他微信扫码,一般这种情...
    许可证的妹妹许多多阅读 346评论 1 3
  • 白纱绕眸 朦胧景致万物美 转角即逝 凭空蜃楼不见影 宛若小鱼 濒危眨鳃求丝氧 空乏健体 无开天辟地之才 挥指方遒 ...
    骚动的萝卜阅读 308评论 0 0