Vue js rerender тот же компонент при изменении маршрута

У меня есть один компонент auth, который я использую как в логине, так и в маршруте регистрации.

const routes = [{
  path     : '/',
  name: 'home',
  component: Home
}, {
  path     : '/signin',
  name: 'signin',
  component: Auth
},
  {
    path     : '/signup',
    name: 'signup',
    component: Auth
  }];

если, например, я на странице входа в систему, проблема в том, что если я набираю что-то в текстовых вводах и иду на регистрацию, текст все еще там, как я заставляю компонент повторно инициализировать?

3 ответов


лучший способ сделать это-фактически привязать путь маршрутов к ключу маршрутизатора-view, т. е.

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

Это заставит Vue создать новый экземпляр компонента.

редактировать

обновлено, чтобы предоставить мета-ключ, который вы можете добавить, что позволит Вам отключить повторное использование компонентов только для требуемых маршрутов. это потребует уточнения, если вы хотите работать с ним на маршрутах глубиной более 1 уровня - но это дает ты идея.

const Foo = {
  name: 'foo',
	data () {
    	return {
        	inputText: '',
        }
    },
	template: `
    	<div class="box">
        	<h1>{{ $route.path }}</h1>
            <input type="text" v-model="inputText">
        </div>
    `,
}

const Baz = {
  name: 'baz',
	data () {
    	return {
        	inputText: '',
        }
    },
	template: `
    	<div class="box">
        	<h1>{{ $route.path }}</h1>
            <input type="text" v-model="inputText">
        </div>
    `,
}

const routes = [
  { path: '/foo', component: Foo, meta: { reuse: false }, },
  { path: '/bar', component: Foo, meta: { reuse: false }, },
  { path: '/baz', component: Baz },
  { path: '/bop', component: Baz }
]

const router = new VueRouter({
  routes
})

const app = new Vue({
  router,
  data: {
    key: null,
  },
}).$mount('#app')

router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.reuse === false)) {
    app.key = to.path
  } else {
    app.key = null
  }
  next()
})
#content {
    position: relative;   
  height: 200px;
}

.box {
    position: absolute;
    top: 0;
    left: 0;
    width: 200px;
    height: 200px;
    background: rgba(0,0,0, 0.2);
    text-align: center;
    transform: translate3d(0, 0, 0);
}
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router@2.0.3"></script>

<div id="app">
  <h1>Hello App!</h1>
  <p>
    <router-link to="/foo">Go to Foo</router-link>
    <router-link to="/bar">Go to Bar</router-link>
    <router-link to="/baz">Go to Baz</router-link>
    <router-link to="/bop">Go to Bop</router-link>
  </p>
  <div id="content">
      <router-view :key="key"></router-view>
  </div>
  <pre>{{ key }}</pre>
</div>

это тогда позволяет объединить ваш маршрутизатор-вид с системой перехода Vues, так что это становится довольно удивительным!


можно использовать ключ указать вю повторно некоторые элементы, вместо того чтобы использовать их.

например, у вас есть <input/> в своем Auth компонент, который вы хотите перезапустить под разными маршрутами, добавьте key Data prop to Auth используйте <input :key="key"/> в шаблоне. В вашем случае здесь

data() {
    key: this.$route.path
}

может быть хорошим выбором.


VueJS кэширует отображаемый компонент. вы не предоставляете Auth код компонента, но я думаю, что вам поможет следующее.

<template>
     <input type="text" ID="username" v-model="usernameinput">
     <!-- other text boxes and inputs -->
</template>
export default {
    name: 'Auth',
    //component code .....
    data: function() {
        return {
            usernameinput: '',
            //and other stuff
        }
    },
    watch: {
        // call method if the route changes
        '$route': 'reInitialize'
    },
    methods: {
        reInitialize: function() {
            this.usernameinput = '';
            //and so on
        }
    },
    //remainig component code
}

также есть еще один posibilty, может быть, вы используете динамические компоненты и keep-alive - это правда.