美文网首页Weex开发技巧weex社区
【Weex开发】v-for元素的class或style没有动态响

【Weex开发】v-for元素的class或style没有动态响

作者: mercurygear | 来源:发表于2017-07-28 18:49 被阅读76次

    现象

    我们先来看下面的一段代码(可以丢到dotWe上自己运行试试),用v-for产生两个div,然后点击按钮触发其中的一个div发生位置变化。

    <template>
      <div>
        <div v-for="(item, index) of list" :key="index" :class="['box', pos[index]]" ></div>
        <div class="btn" @click="onBtnClick"></div>
      </div>
    </template>
    
    <style>
      .box {
        position: absolute;
        left: 200px;
        width: 50px;
        height: 100px;
        background-color: grey;
      }
      .btn {
        top: 300px;
        left: 300px;
        width: 200px;
        height: 150px;
        background-color: blue;
      }
      .top1 {
        top: 30px;
      }
      .top2 {
        top: 150px;
      }
    </style>
    
    <script>
      export default {
        data () {
          return {
            list: [1, 1],
            pos: ['top1', 'top1']
          }
        },
        methods: {
          onBtnClick() {
            this.pos[0] = this.pos[0]=='top1'?'top2':'top1'
          }
        }
      }
    </script>
    

    试过之后,你会发现,点击按钮并没有任何变化。可以通过weex的debug工具查看到,其实div的top已经变更为我们设置的值了,只是UI上没有反应出来。但是,如果改变top值的同时,让UI上的元素的内容发生变化,比如有文字产生改变,那么UI能按照预期正常的显示出来。
    没有动态响应的原因很简单,之前对vue的理解不够透彻,忘记了vue对数组的动态响应前提是使用数组的push、pop等改变数组的方法,而直接通过索引赋值是不能被观察到的。

    解决

    1. 王道:用this.$set(obj, key, value)方法来改变数组元素
    2. 歪道:用this.$forceUpdate()这个函数,让我们可以强制组件进行一次刷新。

    补充

    this.$forceUpdate()也只会在实际的style和class有变化的情况下才会起作用的,假如元素进行动画前,opacity是1,而动画效果是让元素的透明度变为0.5,那么动画完成后,即使当前元素的效果是透明度0.5,但是因为动画并不会真正改变元素动画设置的style和class,所以opacity仍旧是1。
    此时,我们去设置opacity为1,并且this.$forceUpdate()强制更新,因为opacity的值前后并没有变化,所以UI并不会改变。只有设置opacity为其他值,和之前的值不同,强制更新才能出来效果。
    这点尤为要注意!

    相关文章

      网友评论

        本文标题:【Weex开发】v-for元素的class或style没有动态响

        本文链接:https://www.haomeiwen.com/subject/asuflxtx.html