vue,js vue-router 2 组件数据不更新

Posted

技术标签:

【中文标题】vue,js vue-router 2 组件数据不更新【英文标题】:vue,js vue-router 2 component data doesn't update 【发布时间】:2017-03-06 14:25:12 【问题描述】:

我对 vue.js 还很陌生,正在尝试构建一个 SPA。基本上我定义了从我的后端到我的 API 端点的所有路由。他们中的很多人使用相同的组件。使用 router.beforeEach 和 vue-resource 获取数据。

现在,当我从一个路由导航到另一个共享相同模板的路由时,我的路由器视图不会更新。

这是我的代码:

 <script>

var data = 
    content: null


const site = 
    template:'<div>this.title</div>',
    data: function () 
      return data.content.body
    


const home = 
    template:'<div>this.title</div>',
    data: function () 
      return data.content.body
    


const routes = [
             path: '/api/12.json', component: home, alias: '/' ,
             path: '/api/4.json', component: site, alias: '/projekte' ,
             path: '/api/5.json', component: site, alias: '/projekte/projekt-1' ,
             path: '/api/7.json', component: site, alias: '/projekte/projekt-2' ,
             path: '/api/6.json', component: site, alias: '/projekte/projekt-3' ,
             path: '/api/8.json', component: site, alias: '/agentur' ,
             path: '/api/9.json', component: site, alias: '/lab' ,
             path: '/api/10.json', component: site, alias: '/kontakt' ,
        ]

const router = new VueRouter(
    routes
)

router.beforeEach((to, from, next) => 

    Vue.http.get(to.matched[0].path).then((response) => 

        data.content = response;
        console.log(data.content);
        next();

    , (response) => 

        data.content = 
            'body': 
                'title': 'Error 404'
            
        ;
        next();

    );
)

const app = new Vue(
    router

).$mount('#app')

</script>

【问题讨论】:

【参考方案1】:

您的 data 对象不是您的 Vue 组件的一部分。它是在您的 Vue 应用程序之外定义的。

即使您的组件 - homesite 返回 data.content.body 对象,您的主要 data 对象也不是 Vue 反应系统的一部分。因此,不会跟踪 data 对象中的更改。

您可以在此处阅读更多信息:https://vuejs.org/guide/reactivity.html

为确保不会发生这种情况,您需要将data 定义为组件本身的一部分。并且您需要将 http 调用作为路由组件上 mounted 挂钩的一部分,该组件可以访问组件的 this.data

如果您需要在组件之间共享data(很可能),那么您需要使用使用 vuex 的状态管理,它允许您为整个 Vue 应用程序共享状态。

您可以在此处阅读有关 Vuex 的更多信息:http://vuex.vuejs.org/en/intro.html

【讨论】:

vue-router的文档显示可以在link之外定义全局导航守卫 是的,你可以做到。但建议将您的代码包含在应用程序中。这将使您的团队成员能够更好地理解,并且您可以将每个组件的所有权分配给不同的人,从而使事情得到控制。它比技术更具有实际意义。【参考方案2】:

这是一个用于 API 调用的 vue / vue-router / vuex / vue-resource 示例的工作示例。感谢Mani 提供我需要的提示。

const site = 
    template:'<div> content.title </div>',
    computed: 
        content ()
            return store.state.routeContent
        
    


const home = 
    template:'<div> content.title </div>',
    computed: 
        content ()
            return store.state.routeContent
        
    


const notFound = 
    template: '<div> content.title </div>',
    computed: 
        content ()
            return store.state.routeContent
        
    


const routes = [
     path: '/api/12.json', component: home, alias: '/' ,
     path: '/api/4.json', component: site, alias: '/projekte' ,
     path: '/api/5.json', component: site, alias: '/projekte/projekt-1' ,
     path: '/api/7.json', component: site, alias: '/projekte/projekt-2' ,
     path: '/api/6.json', component: site, alias: '/projekte/projekt-3' ,
     path: '/api/8.json', component: site, alias: '/agentur' ,
     path: '/api/9.json', component: site, alias: '/lab' ,
     path: '/api/10.json', component: site, alias: '/kontakt' ,
     path: '/*', component: notFound 
]

const store = new Vuex.Store(
    state: 
        routeContent: null
    ,
    mutations: 
        routeContent (state, payload) 
            state.routeContent = payload
            document.title = payload.title
        
    
)

const router = new VueRouter(
    routes
)

router.beforeEach((to, from, next) => 

    Vue.http.get(to.matched[0].path).then((response) => 
        store.commit('routeContent', response.body)
        next()

    , (response) => 
        console.log(response);
        errorObject = 
            'title': 'Error 404'
        ,
        store.commit('routeContent', errorObject)
        next()

    );
)

const app = new Vue(
    router

).$mount('#app')

【讨论】:

以上是关于vue,js vue-router 2 组件数据不更新的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js路由组件vue-router如何使用?

Vue组件vue-router使用方法小测

vue-router路由

将 props 传递给 Vue-router 实例化的 Vue.js 组件

使用一个数据集时的 Vue-router 组件

Vue.js——vue-router 快速入门