当我想多次搜索时,它会显示NavigationDuplicated个错误.我的搜索在导航栏中,我配置搜索的方式是使用模型获取值,然后将值作为参数传递给ContentSearched组件,然后在该组件中接收搜索值.

我知道正确的方法是使用emits 器,但我仍然不知道如何学习使用它.要访问emit是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)"}

NavBar.vue

<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>

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>

推荐答案

这发生在我身上,当时我有一个router-link指向同一条路由.e、 g./products/1.

用户可以点击产品but if a product was already clicked (and the component view was already loaded),然后用户try 再次点击,错误/警告显示在控制台中.

你可以学到更多.

vue router的主要贡献者之一Posva建议:

router.push('your-path').catch(err => {})

然而,如果你不想让catch块什么都不做,为了解决这个问题,你可以将路由导航与当前的路由and only navigate if they differ:进行比较

const path = `/products/${id}`
if (this.$route.path !== path) this.$router.push(path)

注:$route是vue路由 for each 组件提供的对象.更多信息请参见The Route Object.

Vue.js相关问答推荐

在VueJS中卸载元素之前是否应该删除JavaScript事件收件箱?

更新 Shopware 管理 CMS 组件中的编辑器视图

Vue CLI: 如何在一个vtextfield更改时让另一个vtextfield的值也同时更改,但同时又可以覆盖它?

为什么 Vue 在将设置脚本中的计算(computed)属性渲染到模板时找不到变量

传单 vue3 组件变体打开错误的标记 - 单击时弹出

vue3 ssr 不返回纯 html

当用户在嵌套路由中时激活链接

拖入 vue2-google-map 后如何获取标记位置?

Vue.js 和观察者模式

VueJS:在组件之间使用全局对象的最佳实践?

是否可以在没有 Vue 的情况下使用 Vuex?

可以同时使用 Tailwind css 和 Bootstrap 4 吗?

如何为使用 Vuex store的 Vue 表单组件编写 Jest 单元测试?

正确实现 Vue.js + DataTables

PhpStorm 中Expected预期表达式

即使在客户端设置 Access-Control-Allow-Origin 或其他 Access-Control-Allow-* 标头后也出现 CORS 错误

我可以在 Vue 实例方法中传播的 mapMutations 中使用this吗?

使用 axios 和 vue.js 取消先前的请求

Vuex Mutation 正在运行,但组件在 vue 开发工具中手动提交之前不会更新

如果通过 jquery 更新,Vuejs 绑定不起作用