zoukankan      html  css  js  c++  java
  • Vue-给对象新增属性(使用Vue.$set())

      1 <template>
      2   <div class="practice">
      3     <div class="advertising">
      4       <div class="pic">
      5         <img :src="advert.image" alt @click="goodsNews(advert)" />
      6         <div class="message" v-show="advert.informationTitle">
      7           <p>{{advert.informationTitle}}</p>
      8         </div>
      9       </div>
     10       <div class="news" v-show="informationTitleList.length">
     11         <p  v-for="(item,index) in informationTitleList" :key="index" @click="littleNews(item.skipUrl)">
     12           <i class="circle"></i><span>{{item.title}}</span>
     13         </p>
     14       </div>
     15       <div class="more" v-show="informationTitleList.length">
     16         <span @click="moreNews">更多资讯 <img src="@/assets/images/icon/btn-close-green@2x.png" class="right"/></span>
     17       </div>
     18     </div>
     19     <div class="subject-goods">
     20       <h4>{{loadingPage.name}}</h4>
     21       <div class="goods" >
     22         <vipGoods v-for="(item,index) in loadingPage.list" :key="index" :goodsData="item" @googsDetail="googsDetail(item.targetUrl)" ></vipGoods>
     23       </div>
     24     </div>
     25     <div class="subject-goods" v-for="(item,index) in goodsList" :key="index">
     26       <h4>{{item.categoryName}}</h4>
     27       <div class="goods" v-for="(item,indexs) in item.agivList" :key="indexs" >
     28         <GoodItem v-if='indexs<=curr[index]' :goodItemDetail="item"  @goodsDetail="goodsDetail(item.id)"></GoodItem>
     29       </div>
     30        <div class="more" @click="unfold(index,item)" v-show="item.agivList.length > 4">
     31           <span v-if="curr[index] === 3">展开更多<img src="@/assets/images/icon/btn-close-green@2x.png" /></span>
     32           <span v-else>收起更多<img src="@/assets/images/icon/btn-close-green@2x.png" class="moreGoods"/></span>
     33       </div>
     34     </div>
     35   </div>
     36 </template>
     37 
     38 <script>
     39 import GoodItem from "../../../components/GoodItem";
     40 import vipGoods from "../../../components/vipGoods";
     41 import {JsBridge,isNativeApp} from '@/utils/bridge';
     42 export default {
     43   props:{
     44    curTabChild:{ 
     45     type: Number,
     46     default: 9
     47     }
     48   },
     49   components: {
     50     GoodItem,
     51     vipGoods
     52   },
     53   data() {
     54     return {
     55       advert: {},
     56       goodsList: [],
     57       informationList: [],
     58       loadingPage: {},
     59       curr:[],
     60     };
     61   },
     62   mounted() {
     63     let data = {
     64       categoryId: this.curTabChild,
     65     }
     66     this.$api.accountPractice(data).then(res => {
     67         if (res && res.code == 200) {
     68             this.advert = res.data.advert;
     69             this.goodsList = res.data.goodsList;
     70             this.curr = new Array(res.data.goodsList.length).fill(3);
     71             this.informationList = res.data.informationList;
     72             this.loadingPage = res.data.loadingPage; 
     73         }
     74       })
     75   },
     76   computed: {
     77     informationTitleList: function() {
     78       return this.informationList.slice(0,2)
     79     }
     80   },
     81   methods: {
     82     unfold(index,item) {
     83       if (this.curr[index] === 3) {
     84         this.$set(this.curr,index,item.agivList.length); 
     85       } else {
     86         this.$set(this.curr,index,3);
     87       }
     88
     89     },
     90     // 商品或者资讯跳转
     91     goodsNews(val) {
     92       if(val.type === 'IMAGE') {
     93         JsBridge(null, {path:"jump/news",data:{skipUrl:val.skipUrl}});
     94       } else {
     95         let goodsData = { path:"home/jump/courseInfo",data:{id:goodsId}};
     96         JsBridge(null, goodsData);  
     97       }
     98     },
     99     // 更多资讯
    100     moreNews() {
    101       JsBridge(null, {path:"jump/moreNews",data:{categoryId:this.curTabChild}});
    102     },
    103     // 部分资讯
    104     littleNews(val) {
    105       let newsData = {path:"jump/news",data:{skipUrl:val}};
    106       JsBridge(null, newsData);
    107     },
    108     // 行业财务管理
    109     googsDetail(targetUrl) {
    110       let goodsData = { path:"jump/webview",data:{url:targetUrl, navigation: false}};
    111       JsBridge(null, goodsData);
    112     },
    113     // 其他商品詳情
    114     goodsDetail(courseId) {
    115       let goodsData = { path:"home/jump/courseInfo",data:{id:courseId}};
    116       JsBridge(null, goodsData);
    117     }
    118   }
    119 };
    120 </script>
    121 <style lang='less' scope>
    122 .practice {
    123   .advertising {
    124     // padding-top: 42px;
    125     .pic {
    126        100%;
    127       height: 382px;
    128       position: relative;
    129       padding: 0px 36px;
    130       img {
    131          100%;
    132         height: 100%;
    133       }
    134       .message {
    135          678px;
    136         height: 80px;
    137         white-space: nowrap;
    138         text-overflow: ellipsis;
    139         overflow: hidden;
    140         line-height: 80px;
    141         background: rgba(0, 0, 0, 1);
    142         opacity: 0.5;
    143         border-radius: 0px 0px 12px 12px;
    144         position: absolute;
    145         bottom: 0;
    146         p {
    147           padding-left: 24px;
    148           font-size: 28px;
    149           font-family: Microsoft YaHei;
    150           font-weight: 400;
    151           color: #ffffff;
    152           opacity: 1;
    153         }
    154       }
    155     }
    156     .news {
    157       p {
    158         padding: 36px 60px 32px 60px;
    159         line-height: 10px;
    160         font-size: 26px;
    161         font-family: Microsoft YaHei;
    162         font-weight: 400;
    163         color: rgba(58, 60, 66, 1);
    164         opacity: 1;
    165         .circle{
    166         display:inline-block;
    167         margin-right:10px;
    168         margin-bottom: 3px;
    169         8px;
    170         height:8px;
    171         border-radius:100%;
    172        background:rgba(224,224,224,1);
    173       }
    174       }
    175     }
    176     .more {
    177       //    100%;
    178       height: 96px;
    179       background: rgba(255, 255, 255, 1);
    180       box-shadow: 0px 20px 30px rgba(58, 60, 66, 0.03);
    181       opacity: 1;
    182       line-height: 96px;
    183       text-align: center;
    184       .right {
    185         margin: 33px 12px 0 0;
    186          30px;
    187         height: 30px;
    188         transform: rotate(270deg)
    189       }
    190       span {
    191         font-size: 28px;
    192         font-family: Microsoft YaHei;
    193         font-weight: 600;
    194         color: #00ab84;
    195         opacity: 1;
    196       }
    197     }
    198   }
    199   .subject-goods {
    200     margin-top: 66px;
    201     padding: 0px 36px;
    202     box-shadow: 0px 10px 30px rgba(58, 60, 66, 0.03);
    203     overflow: hidden;
    204     h4 {
    205       font-size: 40px;
    206       font-family: Microsoft YaHei;
    207       font-weight: bold;
    208       // line-height: 38px;
    209       color: rgba(58, 60, 66, 1);
    210       opacity: 1;
    211       margin-bottom: 34px;
    212     }
    213     .goods {
    214       .item {
    215         float: left;
    216         margin-bottom: 30px;
    217          330px;
    218       }
    219       .item:nth-child(2n) {
    220         float: right;
    221       }
    222       .goodItem {
    223         padding-left: 0px;
    224       }
    225     }
    226     .more {
    227       //    100%;
    228       height: 96px;
    229       background: rgba(255, 255, 255, 1);
    230       box-shadow: 0px 20px 30px rgba(58, 60, 66, 0.03);
    231       opacity: 1;
    232       line-height: 96px;
    233       text-align: center;
    234       img {
    235         margin: 33px 12px 0 12px;
    236          30px;
    237         height: 30px;
    238       }
    239       .moreGoods {
    240         transform: rotate(180deg);
    241       }
    242       span {
    243         font-size: 28px;
    244         font-family: Microsoft YaHei;
    245         font-weight: 600;
    246         color: #00ab84;
    247         opacity: 1;
    248       }
    249     }
    250     .more {
    251       //    100%;
    252       height: 96px;
    253       background: rgba(255, 255, 255, 1);
    254       box-shadow: 0px 20px 30px rgba(58, 60, 66, 0.03);
    255       opacity: 1;
    256       line-height: 96px;
    257       text-align: center;
    258       span {
    259         font-size: 28px;
    260         font-family: Microsoft YaHei;
    261         font-weight: 600;
    262         color: #00ab84;
    263         opacity: 1;
    264       }
    265     }
    266   }
    267 }
    268 </style>

    1.使用this.$set(obj, key, value)/vue.set(obj, key, value)

    <script>
    export default {
     data() {
       return {
         student: {
           name: '张三',
         }
       }
     },
     methods: {
       setMessage() {
         this.$set(this.student, 'age', 15)
         console.log(this.student)
       }
     }
    }
    </script>

    2.通过Object.assign(target, sources)方法

    <script>
    export default {
      data() {
        return {
          student: {
            name: '张三',
          }
        }
      },
      methods: {
        setMessage() {
          this.student.age = 15
          this.student = Object.assign({}, this.student)
          console.log(this.student)
        }
      }
    }
    </script>

    我们发现,通过这两种方式为对象添加属性之后,他的对象身上多了get和set方法,所以,此时我们再次操作该属性的时候,就会引起视图的更新啦

  • 相关阅读:
    Android调用Camera API 拍照导致图片变形
    [转]Android PorterDuff.Mode效果
    Android视频录制
    Android调用Camera API 拍照
    Android调用系统拍照
    android:windowIsTranslucent影响Activity生命周期onStop
    ProgressBar自定义之后图片拉伸的解决办法
    android开源ORM框架OrmLite使用教程
    AutoCompleteTextView源码分析
    Android App安全加固
  • 原文地址:https://www.cnblogs.com/lujunan/p/12342501.html
Copyright © 2011-2022 走看看