Chr*_*ael 10 javascript vue.js vuejs2
问题
嗨,开发人员,
我有一个问题,当我想多次搜索时会显示NavigationDuplicated
错误。我的搜索位于导航栏中,而我配置搜索的方式是使用模型获取值,然后将该值作为参数传递给ContentSearched组件,然后在该组件中接收搜索的值。
我知道正确的方法是使用发射器,但我仍然不知道如何学习使用它。要访问发射是context.emit('', someValue)
如果有人可以帮助我解决问题,我将不胜感激。
NavigationDuplicated {_name: "NavigationDuplicated", name: "NavigationDuplicated", message: "Navigating to current location ("/search") is not allowed", stack: "Error? at new NavigationDuplicated (webpack-int…node_modules/vue/dist/vue.runtime.esm.js:1853:26)"}
Run Code Online (Sandbox Code Playgroud)
导航栏
<template>
<nav class="navbar navbar-expand-lg navbar-dark bg-nav" v-bind:class="{'navbarOpen': show }">
<div class="container">
<router-link to="/" class="navbar-brand">
<img src="../assets/logo.png" alt="Horizon Anime" id="logo">
</router-link>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation" v-on:click.prevent="toggleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent" v-bind:class="{'show': show }">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<router-link class="nav-link" to="/" ><i class="fas fa-compass"></i> Series</router-link>
</li>
<li class="nav-item">
<router-link class="nav-link" :to="{name: 'EpisodesSection'}" ><i class="fas fa-compact-disc"></i> Episodios</router-link>
</li>
<li class="nav-item">
<router-link class="nav-link" :to="{name: 'MovieSection'}" ><i class="fas fa-film"></i> Peliculas</router-link>
</li>
</ul>
<div class="search-bar">
<form class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" v-model="query" type="search" placeholder="Buscar películas, series ..." aria-label="Search">
<button class="btn btn-main my-2 my-sm-0" @click.prevent="goto()" type="submit"><i class="fas fa-search"></i></button>
</form>
</div>
</div>
</div>
</nav>
</template>
<script>
import {value} from 'vue-function-api';
import {useRouter} from '@u3u/vue-hooks';
export default {
name: "NavBar",
setup(context){
const {router} = useRouter();
const query = value("");
let show = value(true);
const toggleNavbar = () => show.value = !show.value;
const goto = () =>{
let to = {name: 'ContentSearched' , params:{query: query}}
router.push(to);
};
return{
show,
toggleNavbar,
goto,
query
}
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
ContentSearched.vue
<template>
<div class="container">
<BoxLink/>
<main class="Main">
<div class="alert alert-primary" role="alert">
Resultados para "{{query}}"
</div>
<div v-if="isLoading">
<!-- <img class="loading" src="../assets/loading.gif" alt="loading"> -->
</div>
<div v-else>
<ul class="ListEpisodios AX Rows A06 C04 D02">
<li v-for="(content, index) in contentSearched" :key="index">
<div v-if="content.type === 'serie'">
<Series :series="content"/>
</div>
<div v-if="content.type === 'pelicula'">
<Movies :movies="content"/>
</div>
</li>
</ul>
</div>
</main>
</div>
</template>
<script>
import {onCreated} from "vue-function-api"
import {useState , useRouter , useStore} from '@u3u/vue-hooks';
import BoxLink from "../components/BoxLink";
import Movies from "../components/Movies";
import Series from "../components/Series";
export default{
name: 'ContentSearched',
components:{
BoxLink,
Movies,
Series
},
setup(context){
const store = useStore();
const {route} = useRouter();
const state = {
...useState(['contentSearched' , 'isLoading'])
};
const query = route.value.params.query;
onCreated(() =>{
store.value.dispatch('GET_CONTENT_SEARCH' , query.value);
});
return{
...state,
query,
}
}
};
</script>
Run Code Online (Sandbox Code Playgroud)
fgu*_*len 28
如果你对捕捉所有类型的错误感到不舒服,我认为这个实现更体贴:
this.$router.push("path").catch(error => {
if (error.name != "NavigationDuplicated") {
throw error;
}
});
Run Code Online (Sandbox Code Playgroud)
Ale*_*urt 19
我只想让NavigationDuplicated
错误保持沉默,一个空的捕获可能是危险的。所以我这样做了:
const router = new VueRouter({/* ... */})
const originalPush = router.push
router.push = function push(location, onResolve, onReject)
{
if (onResolve || onReject) {
return originalPush.call(this, location, onResolve, onReject)
}
return originalPush.call(this, location).catch((err) => {
if (VueRouter.isNavigationFailure(err)) {
return err
}
return Promise.reject(err)
})
}
Run Code Online (Sandbox Code Playgroud)
初始化 vue-router 时插入一次。
感谢@Oleg Abrazhaev的更新。
Rus*_*nov 12
在手册中:
router.push(location, onComplete?, onAbort?)
Run Code Online (Sandbox Code Playgroud)
您可以更简单地使用
router.push("/", () => {});
Run Code Online (Sandbox Code Playgroud)
小智 11
我在搜索时遇到了同样的问题。我的解决办法是添加timestamp
到this.$route.query
搜索页面的参数中。
this.$router.push({
path: "/search",
query: {
q: this.searchQuery,
t: new Date().getTime(),
}
});
Run Code Online (Sandbox Code Playgroud)
希望对你有帮助。
小智 6
我认为,如果我们不打算进一步将其Router.push
用作异步调用,则可以在根标签上解决此问题的最佳解决方案。
import Router from 'vue-router';
const originalPush = Router.prototype.push;
Router.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err)
};
Vue.use(Router);
Run Code Online (Sandbox Code Playgroud)
当我router-link
指向同一条路线时,这发生在我身上。例如/products/1
。
用户可以单击产品,但是如果已经单击了产品(并且已经加载了组件视图),并且用户尝试再次单击它,则控制台中将显示错误/警告。
您可以在github问题上了解更多信息。。
Posva是vue-router的主要贡献者之一,他建议:
router.push('您的路径').catch(err => {})
但是,如果您不希望某个catch
块什么也不做,为了解决此问题,您可以将路由器导航与当前路径进行比较,并且仅在它们不同时进行导航:
const path = `/products/${id}`
if ($route.path !== path) this.$router.push(path)
Run Code Online (Sandbox Code Playgroud)
注意:$route
是vue-router为每个组件提供的对象
如果您在代码中使用router.push,并且不关心导航失败,则应使用catch来捕获它:
router.push('/location').catch(err => {})
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9752 次 |
最近记录: |