首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vue.runtime.esm.js?2b0e:619 [Vue警告]:呈现错误:"TypeError:无法读取未定义的属性‘查找’“

vue.runtime.esm.js?2b0e:619 [Vue警告]:呈现错误:"TypeError:无法读取未定义的属性‘查找’“
EN

Stack Overflow用户
提问于 2021-06-10 18:29:44
回答 1查看 1.7K关注 0票数 0

我试图购买一只股票,但当我点击购买,然后看到我的Portfolio.vue,得到的错误如下

vue.runtime.esm.js?2b0e:619 Vue警告:呈现错误:"TypeError:无法读取未定义的属性‘查找’“

找到位置

代码语言:javascript
复制
---> <Portfolio> at src/components/portfolio/Portfolio.vue
       <App> at src/App.vue
         <Root>
warn @ vue.runtime.esm.js?2b0e:619
logError @ vue.runtime.esm.js?2b0e:1893
globalHandleError @ vue.runtime.esm.js?2b0e:1888
handleError @ vue.runtime.esm.js?2b0e:1848
Vue._render @ vue.runtime.esm.js?2b0e:3571
updateComponent @ vue.runtime.esm.js?2b0e:4081
get @ vue.runtime.esm.js?2b0e:4495
Watcher @ vue.runtime.esm.js?2b0e:4484
mountComponent @ vue.runtime.esm.js?2b0e:4088
Vue.$mount @ vue.runtime.esm.js?2b0e:8459
init @ vue.runtime.esm.js?2b0e:3137
merged @ vue.runtime.esm.js?2b0e:3322
createComponent @ vue.runtime.esm.js?2b0e:6022
createElm @ vue.runtime.esm.js?2b0e:5969
updateChildren @ vue.runtime.esm.js?2b0e:6260
patchVnode @ vue.runtime.esm.js?2b0e:6363
updateChildren @ vue.runtime.esm.js?2b0e:6237
patchVnode @ vue.runtime.esm.js?2b0e:6363
updateChildren @ vue.runtime.esm.js?2b0e:6237
patchVnode @ vue.runtime.esm.js?2b0e:6363
patch @ vue.runtime.esm.js?2b0e:6526
Vue._update @ vue.runtime.esm.js?2b0e:3963
updateComponent @ vue.runtime.esm.js?2b0e:4081
get @ vue.runtime.esm.js?2b0e:4495
run @ vue.runtime.esm.js?2b0e:4570
flushSchedulerQueue @ vue.runtime.esm.js?2b0e:4326
eval @ vue.runtime.esm.js?2b0e:1989
flushCallbacks @ vue.runtime.esm.js?2b0e:1915
Promise.then (async)
timerFunc @ vue.runtime.esm.js?2b0e:1942
nextTick @ vue.runtime.esm.js?2b0e:1999
queueWatcher @ vue.runtime.esm.js?2b0e:4418
update @ vue.runtime.esm.js?2b0e:4560
notify @ vue.runtime.esm.js?2b0e:730
reactiveSetter @ vue.runtime.esm.js?2b0e:1055
eval @ vue-router.esm.js?4af9:2989
eval @ vue-router.esm.js?4af9:2988
updateRoute @ vue-router.esm.js?4af9:2409
eval @ vue-router.esm.js?4af9:2263
eval @ vue-router.esm.js?4af9:2397
step @ vue-router.esm.js?4af9:2001
step @ vue-router.esm.js?4af9:2008
runQueue @ vue-router.esm.js?4af9:2012
eval @ vue-router.esm.js?4af9:2392
step @ vue-router.esm.js?4af9:2001
eval @ vue-router.esm.js?4af9:2005
eval @ vue-router.esm.js?4af9:2379
eval @ vue-router.esm.js?4af9:2162
iterator @ vue-router.esm.js?4af9:2357
step @ vue-router.esm.js?4af9:2004
step @ vue-router.esm.js?4af9:2008
step @ vue-router.esm.js?4af9:2008
runQueue @ vue-router.esm.js?4af9:2012
confirmTransition @ vue-router.esm.js?4af9:2387
transitionTo @ vue-router.esm.js?4af9:2260
push @ vue-router.esm.js?4af9:2601
push @ vue-router.esm.js?4af9:3023
handler @ vue-router.esm.js?4af9:1139
invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1863
invoker @ vue.runtime.esm.js?2b0e:2188
original._wrapper @ vue.runtime.esm.js?2b0e:6961
Show 30 more frames
vue.runtime.esm.js?2b0e:1897 TypeError: Cannot read property 'find' of undefined
    at eval (portfolio.js?9639:48)
    at Array.map (<anonymous>)
    at stockPortfolio (portfolio.js?9639:47)
    at wrappedGetter (vuex.esm.js?2f62:881)
    at Vue.eval (vuex.esm.js?2f62:140)
    at Watcher.get (vue.runtime.esm.js?2b0e:4495)
    at Watcher.evaluate (vue.runtime.esm.js?2b0e:4597)
    at Vue.computedGetter [as stockPortfolio] (vue.runtime.esm.js?2b0e:4851)
    at Object.get [as stockPortfolio] (vuex.esm.js?2f62:671)
    at VueComponent.mappedGetter (vuex.esm.js?2f62:1026)

请查找下面的代码和错误的屏幕截图。

购买截图-在这里输入图像描述

期望结果-在这里输入图像描述

结果我得到了-在这里输入图像描述

App.vue

代码语言:javascript
复制
<template>
  <div class="container">
    <app-header></app-header>
    <div class="row">
      <div class="col-xs-12">
        <router-view></router-view>
      </div>
    </div>
  </div>
</template>

<script>
import Header from "./components/Header.vue";

export default {
  components: {
    appHeader: Header,
  },
  created() {
    this.$store.dispatch("initStocks");
  },
};
</script>

<style>
body {
  padding: 30px;
}
</style>

Portfolio.js

代码语言:javascript
复制
const state = {
  funds: 20000,
  stocks: [],
};

const mutations = {
  BUY_STOCK(state, { stockId, quantity, stockPrice }) {
    const record = state.stocks.find((element) => element.id == stockId);

    if (record) {
      record.quantity += quantity;
    } else {
      state.stocks.push({
        id: stockId,
        quantity: quantity,
      });
    }
    state.funds -= stockPrice * quantity;
  },

  SELL_STOCK(state, { stockId, quantity, stockPrice }) {
    const record = state.stocks.find((element) => element.id == stockId);
    if (record.quantity > quantity) {
      record.quantity -= quantity;
    } else {
      state.stocks.splice(state.indexOf(record), 1);
    }
    state.funds += stockPrice * quantity;
  },
};

const actions = {
  sellStock({ commit }, order) {
    commit("SELL_STOCK", order);
  },
};

const getters = {
  stockPortfolio(state, getters) {
    return state.stocks.map((stock) => {
      const record = getters.stock.find((element) => element.id == stock.id);
      return {
        id: stock.id,
        quantity: stock.qunatity,
        name: record.name,
        price: record.price,
      };
    });
  },
  funds(state) {
    return state.funds;
  },
};

export default {
  state,
  mutations,
  actions,
  getters,
};

Portfolio.vue

代码语言:javascript
复制
<template>
  <div>
    <app-stock
      v-for="stock in stocks"
      :key="stock.id"
      :stock="stock"
    ></app-stock>
  </div>
</template>

<script>
import { mapGetters } from "vuex";
import Stock from "./Stock.vue";
export default {
  computed: {
    ...mapGetters({
      stocks: "stockPortfolio",
    }),
  },
  components: {
    appStock: Stock,
  },
};
</script>

如果需要更多的信息,请告知我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-10 19:26:58

这个特定的错误来自您的stockPortfolio getter,具体来说,这一行:

代码语言:javascript
复制
const record = getters.stock.find((element) => element.id == stock.id);

您不能调用getters.stock;您几乎可以肯定地表示要使用state.stock

您的堆栈跟踪可以帮助您在将来更快地找到这类问题:

代码语言:javascript
复制
vue.runtime.esm.js?2b0e:1897 TypeError: Cannot read property 'find' of undefined
    at eval (portfolio.js?9639:48)
    at Array.map (<anonymous>)
    at stockPortfolio (portfolio.js?9639:47)
    at wrappedGetter (vuex.esm.js?2f62:881)
    at Vue.eval (vuex.esm.js?2f62:140)
    at Watcher.get (vue.runtime.esm.js?2b0e:4495)
    at Watcher.evaluate (vue.runtime.esm.js?2b0e:4597)
    at Vue.computedGetter [as stockPortfolio] (vue.runtime.esm.js?2b0e:4851)
    at Object.get [as stockPortfolio] (vuex.esm.js?2f62:671)
    at VueComponent.mappedGetter (vuex.esm.js?2f62:1026)

从底部开始,往上爬,跳过那些似乎没有添加任何东西的行。你要找的只是线索。

  • at VueComponent.mappedGetter (vuex.esm.js?2f62:1026)
    • VueComponent.mappedGetter意味着错误发生在某个组件中的映射Vuex getter中。

  • at stockPortfolio (portfolio.js?9639:47)
    • stockPortfolio是导致错误的getter的直接名称。

  • at Array.map (<anonymous>)
    • 错误发生在Array.prototype.map调用所使用的回调中。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67926696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档