Недавно при разработке некоторых функциональных требований я столкнулся с ситуацией перезагрузки текущих компонентов. Когда в родительском компоненте происходят изменения данных, сбросьте кнопку и обновите только текущий загруженный дочерний компонент.
Давайте узнаем в этой статье Как Vue реализует перезагрузку текущего компонентанесколько видовиспользоватьметод。
И location.reload(), и this.$router.go(0) могут обновить текущую страницу. Недостаток заключается в том, что это эквивалентно нажатию ctrl+F5 для принудительного обновления. Вся страница будет перезагружена, и на мгновение она станет пустой. появится страница, что не является хорошим опытом.
Код родительского компонента:
<template>
<div id="app">
<Son/>
<Button type="primary" @click="reloadPage()">обновить</Button>
</div>
</template>
<script>
import Son from '../../views/TestPage/Son'
export default {
name: 'App',
components: {
Son
},
provide () {
return {
reload: this.reload
}
},
data () {
return {
isRouterShow: true
}
},
methods: {
reloadPage(){
location. reload();
this.$router.go(0);
}
}
}
</script>
Код субкомпонента:
<template>
<div>
<div>
<h3>подкомпонент</h3>
</div>
</div>
</template>
<script>
export default {
name: "son",
data() {
return {
}
},
created() {
this.getList()
},
methods: {
getList(){
alert("----- getList -----")
}
}
}
</script>
Используйте переменные v-if plus для управления загрузкой и уничтожением компонентов. Преимущество состоит в том, что вы можете управлять рендерингом подкомпонентов через переменную в родительском компоненте. При открытии подкомпонент запускает beforeCreate, Created, BeforeMount. и примонтирован, подкомпонент запускает два жизненных цикла: beforeDestroy и Destroy. Поэтому в некоторых операциях, если вам нужно обновить жизненный цикл подкомпонента через содержимое переменной, вы можете использовать v-if для этого. Итак. Показать и скрыть операции.
Код родительского компонента:
<template>
<div id="app">
<Son v-if="isSonShow"/>
<Button type="primary" @click="reloadPage()">обновить</Button>
<Button type="primary" @click="hiddenPage()">скрывать</Button>
</div>
</template>
<script>
import Son from '../../views/TestPage/Son'
export default {
name: 'App',
components: {
Son
},
provide () {
return {
reload: this.reload
}
},
data () {
return {
isSonShow: false,
isRouterShow: true
}
},
methods: {
reloadPage(){
this.isSonShow = false
this.$nextTick(() => {
this.isSonShow = true
})
},
hiddenPage(){
this.isSonShow = false
}
}
}
</script>
$forceUpdate() заставляет экземпляр vue повторно отображать виртуальный DOM. Обратите внимание, что он не перезагружает компонент.
В сочетании с жизненным циклом vue после вызова $forceUpdate будут запущены только две функции-перехватчики: beforeUpdate и update, а другие функции-перехватчики не будут запущены.
Это влияет только на сам экземпляр и дочерние компоненты, вставленные в содержимое слота, а не на все дочерние компоненты.
Принудительное обновление: this.$forceUpdate(), эквивалентный эффект: window.location.reload().
Код родительского компонента:
<template>
<div id="app">
<Son />
<Button type="primary" @click="reloadPage()">обновить</Button>
</div>
</template>
<script>
import Son from '../../views/TestPage/Son'
export default {
name: 'App',
components: {
Son
},
provide () {
return {
reload: this.reload
}
},
data () {
return {
isSonShow: false,
isRouterShow: true
}
},
updated() {
console.log("Родительский компонент обновлен");
},
methods: {
reloadPage(){
this.$forceUpdate()
}
}
}
</script>
Если вам нужно перезагружать компонент каждый раз, когда обновляется текущая родительская страница, вы можете использовать этот метод. Каждый раз, когда компонент обновляется: ключ будет переоцениваться, и метка времени каждый раз будет другой. Если компонент обнаружит этот: ключ. изменения, он будет перерисован.
Код родительского компонента:
<template>
<div id="app">
<Button type="primary" @click="clickM">НажмитеindexKey+1привести кобновитьподкомпонент</Button>
<Son ref="child1" :key='indexKey' :childProp='indexKey'/>
</div>
</template>
<script>
import Son from '../../views/TestPage/Son'
export default {
name: 'App',
components: {
Son
},
provide () {
return {
reload: this.reload
}
},
data () {
return {
isSonShow: false,
isRouterShow: true,
indexKey: 0
}
},
methods: {
clickM() {
this.indexKey += 1;
},
reloadPage(){
this.$forceUpdate()
},
hiddenPage(){
this.isSonShow = false
},
async reload () {
this.isRouterShow = false
await this.$nextTick()
this.isRouterShow = true
}
},
beforeCreate() {
console.log("Перед созданием родительского компонента");
},
created() {
console.log("После создания родительского компонента");
},
beforeMount() {
console.log("Перед монтированием родительского компонента");
},
mounted() {
console.log("После монтирования родительского компонента");
},
beforeUpdate() {
console.log("Перед обновлением родительского компонента");
},
updated() {
console.log("После обновления родительского компонента");
},
beforeDestroy() {
console.log("Перед уничтожением родительского компонента");
},
destroyed() {
console.log("После уничтожения родительского компонента");
}
}
</script>
Код субкомпонента:
<template>
<div class="child1">Этоподкомпонент{{childProp}}</div>
</template>
<script>
export default {
props:['childProp'],
beforeCreate() {
console.log("Перед созданием подкомпонента child1");
},
created() {
console.log("После создания подкомпонента child1", this.childProp);
},
beforeMount(){
console.log("Перед монтированием подкомпонента child1", this.childProp);
},
mounted(){
console.log("После монтирования подкомпонента child1", this.childProp);
},
beforeUpdate() {
console.log("Перед обновлением подкомпонента child1", this.childProp);
},
updated() {
console.log("После обновления подкомпонента child1", this.childProp);
},
beforeDestroy(){
console.log('Прежде чем подкомпонент child1 будет уничтожен', this.childProp);
},
destroyed(){
console.log('После уничтожения подкомпонента child1', this.childProp);
}
};
</script>
Удалить:key='indexKey' из родительского компонента
<Son ref="child1" :childProp='indexKey'/>
Метод «Перезагрузить всю страницу» не рекомендуется, главным образом потому, что эффект опыта не очень хорош.
$forceUpdate: не будет обновлять дочерние компоненты и не рекомендуется.
v-if реализует перезагрузку путем управления переменными, что рекомендуется.
Используйте :key в Метод компоненте относительно элегантен и прост, и его рекомендуется использовать.