vue中的计算属性不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue中的计算属性不起作用相关的知识,希望对你有一定的参考价值。

参考技术A 问题:数组list中有一个check属性,用计算属性根据check的变化来计算check为true的个数,计算属性只在页面显示时作用一次,之后无论如何改变check值,计算属性都不起作用。

解决方案:将‘check’改成别的名字,如‘checkStatus’

Vue js遍历数据子属性不起作用

【中文标题】Vue js遍历数据子属性不起作用【英文标题】:Vue js iterating through data sub-properties is not working 【发布时间】:2018-08-28 06:52:27 【问题描述】:

我是 Vue 新手,我正在尝试使用带有嵌套组件的 Vue 将一个元素与一个相当复杂的数据对象绑定。

我相信我已根据文档正确设置,但我没有看到任何与我的情况完全匹配的示例。

我得到的错误是vue.js:584 [Vue warn]: Property or method "factions" is not defined on the instance but referenced during render. 标记中引用的每个 json 对象属性都会显示此消息。我猜这里缺少一些相对简单的东西,但我无法确定那是什么。感谢您的帮助,谢谢!

这是一个小提琴:https://jsfiddle.net/rjz0gfLn/7/

还有代码:

var x = 
  "factions": [
    
      "id": 0,
      "name": "Unknown",
      "img": "Unknown.png"
    ,
    
      "id": 1,
      "name": "Light",
      "img": "Light.png"
    ,
    
      "id": 2,
      "name": "Dark",
      "img": "Dark.png"
    
  ],
  "roles": [
    
      "id": 0,
      "name": "Unknown",
      "img": "Unknown.png"
    ,
    
      "id": 1,
      "name": "Assassin",
      "img": "Assassin.png"
    ,
    
      "id": 2,
      "name": "Mage",
      "img": "Mage.png"
    
  ],
  "cacheDate": 1521495430225
;

console.log("data object", x);

Vue.component("filter-item", 
    template:   `<li class="fitem">
                    <input type="checkbox" class="fcheck" />
                    <img :src="img" class="fimg" />
                    <span class="fname">
                        name
                    </span>
                </li>`);

Vue.component("filter-items", 
    template: `<ul class="flist">
                    <filter-item v-repeat="factions"></filter-item>
                    <li class="fseperator"/>
                    <filter-item v-repeat="roles"></filter-item>
                </ul>`);

var v = new Vue(
  el: "#filters",
  data: x
);
<nav id="filter-drawer">
  <ul id="filters" class="flist">
        <filter-items></filter-items>
    </ul>
</nav>

【问题讨论】:

【参考方案1】:

您必须在这些子组件中将要传递给子组件的每个数据声明为props。此外,您需要使用:fieldnameinchild="value"v-bind:fieldnameinchild="value" 的简写形式)从父级传递每个道具。

在你的情况下,你需要在几个地方这样做:

家长:

<filter-items :factions="factions" :roles="roles"></filter-items>

还有孩子:

<filter-item v-for="f in factions" :img="f.img" :fimg="f.fimg" :name="f.name" :key="'f'+f.id"></filter-item>
<filter-item v-for="r in roles" :img="r.img" :fimg="r.fimg" :name="r.name" :key="'r'+r.id"></filter-item>

注意,在 vue2 中你要使用 v-for 而不是 v-repeat

另外,将:key 添加到v-for

[Vue 提示]: : 使用 v-for 渲染的组件列表应该有明确的键。请参阅https://vuejs.org/guide/list.html#key 了解更多信息。

查看更新的小提琴:https://jsfiddle.net/acdcjunior/rjz0gfLn/21/

var x = 
  "factions": [
    
      "id": 0,
      "name": "Unknown",
      "img": "img.png"
    ,
    
      "id": 1,
      "name": "Light",
      "img": "/a/a6/Light.png"
    ,
    
      "id": 2,
      "name": "Dark",
      "img": "/0/0e/Dark.png"
    
  ],
  "roles": [
    
      "id": 0,
      "name": "Unknown",
      "img": "img.png"
    ,
    
      "id": 1,
      "name": "Assassin",
      "img": "/6/69/Assassin.png"
    ,
    
      "id": 2,
      "name": "Mage",
      "img": "/2/20/Mage.png"
    
  ],
  "cacheDate": 1521495430225
;

console.log("data object", x);

Vue.component("filter-item", 
    template:   `<li class="fitem">
                    <input type="checkbox" class="fcheck" />
                    <img :src="img" class="fimg" />
                    <span class="fname">
                        name
                    </span>
                </li>`,
  props: ['img', 'fimg', 'name']
                
);

Vue.component("filter-items", 
  template: `<ul class="flist">
            	  <filter-item v-for="f in factions" :img="f.img" :fimg="f.fimg" :name="f.name" :key="'f'+f.id"></filter-item>
            	  <li class="fseperator"/>
               <filter-item v-for="r in roles" :img="r.img" :fimg="r.fimg" :name="r.name" :key="'r'+r.id"></filter-item>
             </ul>`,
  props: ['factions', 'roles']
);

var v = new Vue(
  el: "#filters",
  data: x
);
<script src="https://unpkg.com/vue"></script>

<nav id="filter-drawer">
  <ul id="filters" class="flist">
        <filter-items :factions="factions" :roles="roles"></filter-items>
    </ul>
</nav>

【讨论】:

【参考方案2】:

factions 属于根 Vue 实例,filter-items 有一个不同的 data 对象。您可能希望将 factions 作为道具传递给 filter-items

https://vuejs.org/v2/guide/components.html#Passing-Data-with-Props

Vue.component("filter-items", 
    props: ['factions'],
    template: `<ul class="flist">
                <filter-item v-repeat="factions"></filter-item>
                <li class="fseperator"/>
                <filter-item v-repeat="roles"></filter-item>
        </ul>`);


var v = new Vue(
  el: "#filters",
  data: x
);
<nav id="filter-drawer">
  <ul id="filters" class="flist">
        <filter-items :factions="factions"></filter-items>
    </ul>
</nav>

编辑:v-repeat 已弃用,请使用 v-for,并且您不会将道具传递给 filter-item

【讨论】:

以上是关于vue中的计算属性不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Vue 中未调用计算属性集

Vue 中未调用计算属性集

在 vueJs 中使用计算属性中的方法

vue的计算属性

如何将计算属性中的 vuex 数据传递给 data prop

EmberJS 基于数组的计算属性不起作用