vue 的 computed 相关的一个问题,求助

2019-09-02 23:19:18 +08:00
 Hopetree

但愿这个图能显示

情况如图所示,这个计算属性会在 sctext 变动时触发,实际上也的确会这样,但是我在 HTML 中使用{{ suggestion }}发现是空的,但是 console 日志会刷新值,所以很奇怪,为甚返回不到值?

如果图挂了,看源码:

<template>
    <div>
    	...	方便查看所以省略其他
        <p>{{ suggestion }}</p>
    </div>
</template>

<script>
export default {
    data() {
        return {
            // 从 store 里面读取数据并使用
            sctype: "",
            scdata: {},
            sctypelist: [],
            sctext: "",
        };
    },
    created() {
        // 设置默认值
        var default_type = this.$store.getters.searchTypes[0];
        this.sctype = default_type;
        this.sctypelist = this.$store.getters.searchTypes;
        this.scdata = this.$store.state.searchList[default_type];
    },
    computed: {
        suggestion: function() {
            var a = ''
            this.$axios
                .get("/baidu/su", { params: { wd: this.sctext } })
                .then(ret => {
                    var json_str = ret.data.match(/s:(\[.*\])}\);/);
                    if (json_str) {
                        var json_str = json_str[1];
                    }
                    console.log(json_str);
                    a = json_str
                });
            return a
        }
    },
    methods: {
        // 选择表单变化的时候同步数据
        changedata: function(command) {
            this.sctype = command;
            this.scdata = this.$store.state.searchList[command];
        }
    }
};
</script>

<style scoped>
img {
    width: 1.2rem;
    margin: 0rem 0.2rem -0.2rem 0rem;
}
</style>

7765 次点击
所在节点    Vue.js
42 条回复
tumobi
2019-09-03 09:21:39 +08:00
还是使用 async await 吧
no1xsyzy
2019-09-03 09:25:44 +08:00
基础概念问题…… 附一个 2014 年的演讲:
<amp-youtube data-videoid="8aGhZQkoFbQ" layout="responsive" width="480" height="270"></amp-youtube>
SilentDepth
2019-09-03 09:27:49 +08:00
@no1xsyzy #20 那个开关不是都被废弃了吗,没准哪天都不能用了(
hyy1995
2019-09-03 09:34:24 +08:00
你这个问题其实跟 vue 没啥关系,纯粹就是网络请求没请求完成前,你就 return 返回了,此时数据都还没取到,这就是个异步问题,太秀了吧。。。
liuguang
2019-09-03 09:38:04 +08:00
因为这个是异步的,请求还没完成,就 return 了
galikeoy
2019-09-03 09:45:40 +08:00
计算属性嵌套异步请求,龟龟,骚操作
jrtzxh020
2019-09-03 09:48:27 +08:00
有个 asyncComputed 的库 可以了解一下
lscho
2019-09-03 09:48:56 +08:00
亲亲,建议您学习一下 js 噢
mikoshu
2019-09-03 10:08:10 +08:00
只想说一句 666 好歹把 return 写到 promise 里面呀
Curtion
2019-09-03 10:12:08 +08:00
这是异步问题啊,和我初学 js 时犯的问题的一样,建议看看书巩固下基础
mikoshu
2019-09-03 10:15:58 +08:00
@mikoshu 就算 return 写到 promise 里 还得 return axios 然后返回一个 promise 估计也不好使 果然只能用 await 了 还有楼主改成 watch 的话 如果这个值变动很快 比如监听 input 的 input 事件 就得故意加延迟查询 不然请求太多
Biwood
2019-09-03 10:17:05 +08:00
1 楼和 7 楼都已经说到点子上了,去了解一下 JavaScript 同步和异步的原理和机制,比乱猜乱尝试有意义多了。后面还一堆扯到 async await 的,到底是有多菜啊各位,学习框架就真的不用学底层和基础知识了吗
tolking
2019-09-03 10:19:20 +08:00
建议你打开项目的 eslint 或者配置下。这种情况就会直接提示
```
Unexpected asynchronous action in "suggestion" computed property.eslint(vue/no-async-in-computed-properties)
```
shintendo
2019-09-03 10:36:55 +08:00
上面说用 await 可以解决的各位,麻烦上个代码好吗?
shintendo
2019-09-03 10:37:12 +08:00
@Biwood +1 我都惊了
ljpCN
2019-09-03 10:55:05 +08:00
楼主已经解决了,而且也很耐心地去寻求解决方案并尝试。不过还是想说,学 vue 之前,先学 js
wunonglin
2019-09-03 11:06:26 +08:00
这边建议 lz 先重新学习 vue 呢亲,async 也要另外学一下
Sapp
2019-09-03 12:48:17 +08:00
我好久没用过 computed 了,但是我似乎记得,这个属性推荐的是做同步操作啊?你这个需求应该在坚挺某个输入的值变化,然后再调用请求,请求完成之后设置 this.a
mamahaha
2019-09-03 13:02:06 +08:00
你这个相当于是暗恋一个人,对方却不知道。
johnnyNg
2019-09-03 13:49:59 +08:00
建议重学 js

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/597355

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX