当前位置: 首页 > 知识库问答 >
问题:

Vue Component默认数据值覆盖我在beForeRouteUpdate中设置的内容

慕乐语
2023-03-14

我使用vue-router的beForeRouteEnter和beForeRouteUpdate从REST API获取数据

<template>
  <div>
    <h2>{{ league.name }} </h2>
    <user-list :users="league.leaderboard" type="list"/>
  </div>
</template>

<script>
import UserList from '../components/UserList.vue'
import League from '../model/League'
export default {

    components: {
        UserList
    },

    data() {
        return {
            league: { name: 'init', leaderboard: [] },
        }
    },

    methods: {
        setLeague(league) {
            this.league = league
        }
    },

    beforeRouteEnter(to, from, next) {
        League.$find(to.params.league)
            .then(league => {
                next(vm => {
                    vm.league = league
                })
            })
            .catch(err => {
                if(err.response && err.response.status == 404)
                    next('/404')
                else
                    next(vm => vm.error = err)
            })
    },

    watch: {
        league() {
            console.log('league changed ', this.league)
        }
    },

    beforeRouteUpdate(to, from, next) {
        this.league = null
        League.$find(to.params.league)
            .then(league => {
                this.setLeague(league)
                console.log('beforeUpdate: ', this.league)
                next()
            })
            .catch(err => {
                if(err.response && err.response.status == 404)
                    next('/404')
                else {
                    this.error = err
                    next()
                }
            })
    }
}
</script>

<style>

</style>

beforeRouteEnter防护装置按预期工作。

在我的应用程序中,有一种常见的情况,路由从/leagues/1更改为/leagues/1,因此我的组件被重用,beforeRouteUpdate保护被触发。在那里,获取其余数据,并通过此设置联赛数据。setLeague()。控制台。日志调用输出新的联盟数据。但是,当调用next()时,```这个。league``被重写为我在数据函数中指定的默认值(名称:“init”等)。我不知道为什么。

我基本上直接从vue文档中改编了这段代码。

需要注意的一件有趣的事情是,。league=null触发观察者,而则触发此。setLeague没有。此外,在更新之前登录的输出不是vue观察者,而是普通联盟对象。我试着改变这个。setLeague调用此。league=league,这没有帮助。

共有1个答案

沃皓轩
2023-03-14

我也有同样的问题,所以我创建了新的测试组件,并开始测试它。我发现创建()挂载()data()钩子两次触发,这意味着路由器每次都重新创建组件,而不是缓存组件。然后我看了应用程序组件,并保存它的原因。我为每个路由分配了唯一的密钥,因此它将使用不同的组件实例,而不是每个路径的一个实例,如 /test/page/1和 /test/page/2.所以我把它取了下来现在一切正常

所以,如果您在主组件中看到与下面相同的代码,请将其替换为最后一个。

<template>
  <router-view :key="$route.fullPath"></router-view>
</template>
<template>
  <router-view></router-view>
</template>
 类似资料:
  • 我试图将Spring应用程序(大部分)转换为Spring Boot应用程序。在应用程序中,我有一个HTTP基本过滤器,收集用户名和密码,然后在DataSource实现中作为变量传递。 在这个数据源中,getConnection()方法是这样的: (由于StackOverflow格式问题,\n作为新行) 在Spring中,我可以毫无问题地实现@autowiledPrivate DataSource

  • 基本上我想知道,如果得到空值,如何将默认值设置为Pojo变量? 我在项目中使用了Spring数据Cassandra。布尔列中的某些条目为null,当我从数据库中提取记录时,它会引发以下错误: 布尔值不能为null 甚至我也面临着同样的问题。。。列。 因此,当数据库的列为null时,我想给这些字段一个默认值。 这是我希望的最后一个例子: 我已经了解了//...但是我什么都没有。 请帮帮我。

  • 问题内容: 我已经在现有的mysql数据库中反映了表的负载。我想表示的是,任何表中具有特定名称的任何列默认为datetime.now()。但是,天真地遍历表和列,仅对那些我发现具有特定名称的表和列设置默认设置是行不通的。session.flush()我收到以下错误: 这似乎与对_set_parent的调用(以及在sqlalchemy.schema的第721行中的调用)有关。 有谁知道是否有办法做到

  • 我想在测试中重写Application.properties中定义的属性,但@TestPropertySource只允许提供预定义的值。 我需要的是在一个随机端口N上启动一个服务器,然后将这个端口传递给spring-boot应用程序。端口必须是短暂的,以允许在同一主机上同时运行多个测试。 我指的不是嵌入式http服务器(jetty),而是在测试开始时启动的一些不同的服务器(例如zookeeper)

  • 问题内容: 有没有一种方法可以在共享首选项中设置默认值? 这是我的负载偏好代码 这是我的保存偏好代码 问题答案: 当您使用键和值设置首选项时,实际上是在提供该值。因此,这次不必使用默认值。请参见,在检索该值时,如果以前未设置该值,则可以定义一个默认值。 如果您得到strSavedMem1 =“ default”,那么肯定是默认情况,因为您没有在首选项中为MEM1设置任何其他值

  • 我使用的是spring cloud Consult 1.0.0.m5和spring boot 1.3.2。spring cloud Consult用于连接到Consult代理的默认主机和端口是localhost:8500。我想改变这一点,但迄今为止我尝试的每一种方法都不尊重设置。 我查看了spring cloud Consult的源代码,并且ConsulProperties是在属性前缀spring