通过模板重置vue js布尔值

Posted

技术标签:

【中文标题】通过模板重置vue js布尔值【英文标题】:reseting vuejs boolean value via template 【发布时间】:2020-04-20 16:08:21 【问题描述】:

出于某种原因(不要问我为什么),我不得不通过模板重置 VueJS 中的变量。所以,在 vuejs 中,我有这个:

const someApp = new Vue(
delimiters: ['[[', ']]'],
el: '#some-app',
data: 
    flag: 0,
,
methods: 
    changeFlag(val) 
        if (val === 0)//dumb stuff
            this.flag=0;
        
        else if (val ===1)
            this.flag=1;
        
        return this.flag;
    ,
    ...

在我的模板中我有这个:

        <div :data-flag="changeFlag(0)"></div>
        <p class="card-text"> User story(s):</p>
        <template v-for="item in UserStories">
          <ol v-if="(some_complex_logic_here_via_filters )">
            <li :name="post.id + '__UA'"  :data-flag="changeFlag(1)"> [[ item.something] ]] </li>
          </ol>
      </template>
        <p v-if="(flag === 0)">No user stories found.</p>

这个想法是通过执行changeFlag(0)changeFlag(1) 我可以稍后控制&lt;p&gt; 标签。但是,由于某种原因,当我执行此操作时,浏览器似乎挂起。当我删除 for 循环时,一切似乎都正常 - 没有用户搅拌的 &lt;p&gt; 标记正确呈现。错误似乎是当我使用changeFlag(1) 重置时。

我对 VueJS 很陌生,我想知道这是否有一些使用错误......

【问题讨论】:

为什么不直接更改flag 的值而不使用changeFlag() 方法。这似乎更容易...... @MarsNebulaSoup:没有方法我该怎么做?你能给我看一些代码吗? someApp.flag = val @MarsNebulaSoup:我是否在某个 html 标记中执行此操作? 另外,为什么方法 approac 不起作用?这很奇怪。 【参考方案1】:

这确实是一个无限渲染循环,也是在 Vue 中做事的糟糕方式。 不要更改模板中的响应式数据(渲染函数)!!

了解computed properties

computed: 
  filteredUserStories() 
    return this.UserStories.filter( ...some_complex_logic_here_via_filters... )
  

<div v-if="filteredUserStories.length > 0">  
  <p class="card-text"> User story(s):</p>
  <ol>
    <li v-for="item in filteredUserStories" :key="item.id"> item.something </li>
  </ol>
</div>
<p v-else>No user stories found.</p>

这不仅是在 Vue 中更简洁的方法,而且更有效,因为 filteredUserStories 计算的属性值由 Vue 缓存并仅在 UserStories 更改或某些过滤器更改时重新计算(假设这些过滤器和它们的参数是反应性的)

【讨论】:

以上是关于通过模板重置vue js布尔值的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 Laravel 到 Vue.js 的布尔值

无法重置布尔值 - Javascript

使用 Vue Firestore 设置布尔值

如何通过布尔值在播放视图模板中呈现不同的 html 元素?

在列表视图多选中设置状态后,颤振布尔值重置

js中数字是非布尔值吗