【问题标题】:Vue component not updated when props are async道具异步时Vue组件未更新
【发布时间】:2017-10-24 13:07:00
【问题描述】:

我有这个组件

<template>

    <div class="list-group">
        <div v-for="user in data">
            <!-- omitted for brevity -->
        </div>
    </div>

</template>


<script>

    export default ("users-list", {
        props: ['users']
        ,

        data() {
            return {
                data: this.users
            }
        }
    });

</script>

这个组件是从另一个组件中使用的,它使用 $.ajax (Promise) 获取数据并设置数据

<template>
    <div>
        <users-list v-bind:users="users"></users-list>
    <div>   
</template>


<script>

    import UsersService from './users.service.js';
    import UsersList from './users.list.vue';


 export default ('users-main', {
        components: {
            'users-list': UsersList
        },
        mounted() {
            this.refresh();
        },
        data() {
            return {
                data: null,
                message: null,
                user: null
            }
        },
        methods: {
            refresh() {
                let service = new UsersService();
                service.getAll()
                    .then((data) => {
                        this.data = data;

                    })
                    .catch((error) => {
                        this.message = error;
                    })

            },
            selected(user) {
                this.user = user;
            }
        }
    });

</script>

这就是用户服务

import $ from 'jquery';

export default class UsersService {
    getAll() {

        var url = "/Api/Users/2017";

        return new Promise((resolve, reject) => {
            $.ajax({
                url: url,
                success(data) {
                    resolve(data);
                },
                error(jq, status, error){
                    reject(error);
                }

            });
        });
    }
}

如您所见,如果我更改,服务会使用Promise 获取数据

<div v-for="user in data">

进入属性,我可以看到用户

<div v-for="user in users">

问题:如何将 async props 值传递给组件?

【问题讨论】:

  • 有时,让事情变得简单并避免很多麻烦将异步请求放入组件是最好和最简单的方法。不过,不知道这是否适合你。

标签: vue.js vuejs2 vue-component


【解决方案1】:

您在 users-list 中设置了一次“onInit”数据。 对于反应性,你可以做

computed:{
   data(){ return this.users;}
}

watch: {
    users(){
    //do something
    }
}

【讨论】:

    【解决方案2】:

    什么意思:

    如您所见,如果我更改,服务会使用 Promise 获取数据

    &lt;div v-for="user in data"&gt;

    进入属性,我可以看到用户

    &lt;div v-for="user in users"&gt;

    使用&lt;div v-for="user in users"&gt; 应该可以,有什么问题?

    【讨论】:

    • 我想要一份数据副本,用于添加/删除项目而不触及原始数据
    • 好的,那你需要$watch对原users的更新,或者使用计算方法
    猜你喜欢
    • 2017-09-01
    • 2021-08-09
    • 2015-07-13
    • 1970-01-01
    • 2020-01-19
    • 2020-09-30
    • 2019-10-31
    • 2018-11-16
    • 2020-08-03
    相关资源
    最近更新 更多