【问题标题】:Vue template doesn't updateVue模板不更新
【发布时间】:2017-11-23 13:45:03
【问题描述】:

我正在使用 VueJS 构建我的第一个项目,但我无法使用 v-if 获取模板来显示/隐藏。我有一个数据模型布尔变量(groups.categories.descEditable),我正在切换以显示/隐藏模板。出于某种原因,当我更改该值时,模板不会主动更新自身。

<tbody v-for="group in groups">
    ...
    <tr v-for="cat in group.categories">
       ...
        <td class="td-indent">
            <input v-if="cat.descEditable" :value="cat.description" type="text" class="form-control">

            <div v-else v-on:click="editDesc(cat.id)">{{ cat.description }}</div>


            <div>{{cat.descEditable}}</div>
        </td>
        ...
    </tr>
</tbody>


methods: {
    editDesc (cat_id) {

        let vm = this

        this.groups.forEach(function(group, gr_ind){
            group.categories.forEach(function(cat, ind) {

                if (cat_id == cat.id)
                    cat.descEditable = true
                else 
                    cat.descEditable = false
            })
        })
    }
},

所以我希望文本输入显示 descEditable 是否为真(单击包含描述的 div 后),否则显示具有静态描述值的 div。 descEditable 属性似乎正在正确更新,但输入元素上的 v-if 没有对其做出反应。我一定是误解了 vuejs 的一些基本原理,只是无法弄清楚它是什么。

【问题讨论】:

  • 我发现模板状态实际上是在内部更新,但由于某种原因它没有呈现。我通过调用 vm.$forceUpdate() 找到了解决方案,但这似乎并不是真正的“正确”答案。如果有人有更好的方法,请分享。

标签: javascript vue.js vuejs2


【解决方案1】:

我认为你可以完全放弃 editDesc 方法。

console.clear()

const groups = [
  {
    categories:[
      {
        descEditable: false,
        description: "click me"
      
      }
    ]
  }
]


new Vue({
  el:"#app",
  data:{
    groups
  }
})
<script src="https://unpkg.com/vue@2.2.6/dist/vue.js"></script>
<div id="app">
  <table>
    <tbody v-for="group in groups">
      <tr v-for="cat in group.categories">
        <td class="td-indent">
          <div v-if="cat.descEditable">
            <input v-model="cat.description" type="text" class="form-control">
            <button @click="cat.descEditable = false">Save</button>
         </div>
         <div v-else @click="cat.descEditable = true">{{ cat.description }}</div>
       </td>
      </tr>
    </tbody>
  </table>
</div>

【讨论】:

  • 优雅点,但它仍然不起作用。我发现模板状态实际上是在内部更新,但由于某种原因它没有呈现。如果我更改组件文件然后保存,我可以让它渲染,导致 Vue 开发服务器“刷新”dom。显然这并不能解决我的问题。有没有办法强制刷新 Vue 的 DOM 或其他一些“正确”的方式来确保渲染更改?
  • @user3246127 这确实有效。有几个问题。我捏造了一些数据并将其转换为一个工作示例。将来,请提供一些可使用的数据或演示问题的工作示例。让事情变得更容易。
  • 奇怪的是我不能让它为我工作(如果这很重要,我会在组件中使用它)。我可以通过调用 this.$forceUpdate() 来让我的工作,但我更喜欢你的解决方案,如果我能让它工作的话。感谢您的帮助。
  • @user3246127 如果你分享代码我可以看看。 Github、pastebin 等等。
  • 那太好了,完整的组件在这里:gist.github.com/ChadTiffin/90ca1647ced97eb1efdccd3dd3961e01
猜你喜欢
  • 2020-12-22
  • 1970-01-01
  • 2019-07-29
  • 2021-11-21
  • 1970-01-01
  • 2020-10-08
  • 2021-06-20
  • 2013-09-17
  • 1970-01-01
相关资源
最近更新 更多