【问题标题】:vue js component doesn't rerender on the same pagevue js组件不会在同一页面上重新呈现
【发布时间】:2018-01-04 11:10:50
【问题描述】:

我有一个组件

<template>somecode</template>
<script>
 export default {
        name: 'Card',
        created() {
                axios.get(apiObjUrl)
                      somecode
                })
     }
</script>

这是我的网址: http://127.0.0.1:8080/#/card/12

但我有一个问题:

当我像这样使用路由器链接时:

<router-link to="/card/155"> card 155</router-link>

我的网址更改:http://127.0.0.1:8080/#/card/155

created() 方法不会被触发。 所以我不会向 api 提出新的 xhr 请求 数据不变 我该怎么办?

【问题讨论】:

标签: vue.js


【解决方案1】:

作为替代方案,您可以像这样在&lt;router-view&gt; 上设置key 属性:

    <router-view :key="$route.fullPath"></router-view>

由于&lt;router-view&gt; 本身就是一个组件,唯一的键会强制替换组件而不是重用它。所以你可以利用生命周期钩子。

fiddle

【讨论】:

  • :key attr 到底在这里做什么?
  • @user2950593key 告诉 Vue 的虚拟 DOM 算法在将新节点列表与旧列表进行比较时识别 VNode。简单来说,它告诉 vue 应该用新的节点替换(重新渲染)节点,因为在每次路由更改时都会通过新的路由路径传递新的键。
  • 效果很好!谢谢你的解释!
【解决方案2】:

那只是因为你的组件已经创建好了。您可以尝试使用生命周期挂钩 updated() 而不是 created()

 export default {
   name: 'Card',
   updated() {
     axios.get(apiObjUrl)
     somecode
   })
 }

注意:这仅在您的 DOM 更改时才有效。如果你只是想监听 url 的变化并相应地更新你最好$watch你的路线像这样。

export default {
  name: 'Card',
  created() {
    axios.get(apiObjUrl)
    somecode
  }),
    watch: {
    '$route': function() {
        // do your stuff here
    }
    }
}

【讨论】:

  • 当我将 created 方法更改为 updated 时,更新的方法在我第一次加载页面时不会被触发(我不知道为什么)在控制台中什么都没有
  • 我不太明白
  • 我需要在刷新页面时创建的页面上调用相同的代码axios.get(apiObjUrl),并在使用router-link 更改网址时,我该怎么做呢?
  • 我已经编辑了我的代码,有一个小错误。保留您当前的代码并为其添加 watch 属性。这可以获取您想要的任何属性并监听更改。每当发生更改时(在这种情况下,只要您的 url 更改),它就会触发其执行块中的任何表达式。更多信息:vuejs.org/v2/api/#vm-watch
猜你喜欢
  • 2019-07-06
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 2019-09-08
  • 2019-03-26
  • 2021-01-20
相关资源
最近更新 更多