#javascript #vue.js
Вопрос:
Я открываю один и тот же контент компонента, так как у меня есть другой, (проблема с рендерингом )
У меня есть модальный компонент под названием modal.vue (многоразовый), поэтому каждый раз, когда я создаю компонент, я вызываю модальный компонент и добавляю новый контент,
Проблема в том, что у меня есть два компонента ( country.vue и city.vue), я импортирую их оба в свой index.vue
но каждый раз, когда я нажимаю на кнопку «Город», чтобы загрузить компонент «город», я загружаю модальный параметр «страна», точно так же, как возникает проблема с рендерингом ( я не могу повторно выполнить рендеринг).
может кто-нибудь объяснить мне решение, пожалуйста, это мой код
modal.vue ( может использоваться повторно )
<template>
<div class="right-bar" :class="(size == null) ? 'right-bar-35' : size">
<simplebar class="h-100">
<div class="rightbar-title px-3 py-4">
<div class="row">
<div class="col-lg-10">
<h5 class="m-0">{{title}}</h5>
</div>
<div class="col-lg-2 text-right">
<span class="clickable" @click="hideRightSidebar"><i class="mdi mdi-close-thick"></i></span>
</div>
</div>
</div>
<div class="px-3 py-4">
<slot/>
</div>
<footer class="modal-footer">
<button type="button" class="btn btn-secondary" style="float:left;">Cancel</button>
<slot name="footer"/>
</footer>
</simplebar>
</div>
</template>
как вы можете видеть, у меня <slot/>
в компоненте есть a, поэтому каждый раз вводите новый контент.
Это мой компонент country.vue ( я использую здесь компонент modal.vue )
<template>
<div>
<button class="btn btn-sm btn-white" @click="init">Filter <i class="mdi mdi-filter"></i></button>
<modal title="countries" v-if="showModal">
i 'am the country modal
</modal>
</div>
</template>
<script>
import RightBar from "@/components/modal";
export default {
data() {
return {
showModal: false
}
},
components:{
modal,
},
methods: {
init: function(){
this.showModal= true;
}
}
}
</script>
This is my city.vue component ( i use here modal.vue component )
<template>
<div>
<button class="btn btn-sm btn-white" @click="init">Filter <i class="mdi mdi-filter"></i></button>
<modal title="cities" v-if="showModal">
i 'am the citymodal
</modal>
</div>
</template>
<script>
import RightBar from "@/components/modal";
export default {
data() {
return {
showModal: false
}
},
components:{
modal,
},
methods: {
init: function(){
this.showModal= true;
}
}
}
</script>
Это мой index.vue ( где я загружаю city.vue и country.vue), как вы можете видеть, у обоих моих компонентов есть кнопка
<template>
<div>
<city></city>
<country></country>
</div>
</template>
<script>
import addContact from "./city.vue";
import filterContact from "./country.vue";
export default {
components:{city,country}
data(){
return {
}
}
}
</script>
Поэтому, когда я нажимаю на город, я вижу модальную страну ( проблема повторного рендеринга), как я могу это решить
Комментарии:
1. так вот как это должно выглядеть? codesandbox.io/s/kind-khorana-pphhu?file=/src/components/…
2. создайте свой код в поле «Отправить» и отправьте ссылку здесь. Возможно, я смогу вам помочь. иди сюда. переполнение стека не любит много комментировать chattory.com/?chat=891742
3. @RuthDavis, Пожалуйста, не публикуйте повторяющиеся вопросы, чтобы придать вашему вопросу актуальность или добавить детали. Вы можете просто отредактировать свой исходный вопрос в следующий раз.
Ответ №1:
Вот пример:
в компоненте «Город и страна» добавьте функцию, которая сообщает родительскому компоненту о том, что будет повторная передача. вы вызываете эту функцию, как только нажимаете на кнопку показать модальный режим.
init(){
this.rerender()
this.showModal= true
},
rerender(){
this.$emit('forceRerender', true)
}
затем в родительском компоненте мы прослушаем эту функцию и повторим.
<city v-if="isCountry" v-on:forceRerender="hideCountry" />
<country v-if="isCity" v-on:forceRerender="hideCity" />
data(){
return{
isCountry: true,
isCity: true,
}
},
methods:{
hideCountry(){
this.isCountry= false
this.$nextTick(()=>{
this.isCountry= ture
})
},
hideCity(){
this.isCity= false
this.$nextTick(()=>{
this.isCity= ture
})
}
}
чтобы сломать его. когда мы хотим загрузить модальный из компонента «город», мы говорим компоненту «страна» сначала закрыть модальный. Я надеюсь, что это сработает для вас.
другой способ с помощью оператора switch:
город:
rerender(){
this.$emit('forceRerender', 'city')
}
Страна:
rerender(){
this.$emit('forceRerender', 'country')
}
родительский компонент:
<city v-if="isCountry" v-on:forceRerender="setActiveElement" />
<country v-if="isCity" v-on:forceRerender="setActiveElement" />
setActiveElement(element){
switch(element){
case 'city':
this.isCity = true
this.isCountry = false
this.$nextTick().then(()=>{
this.isCountry = true
})
break
case 'country':
this.isCountry = true
this.isCity = false
this.$nextTick().then(()=>{
this.isCity= true
})
break
default:
this.isCountry = this.isCity = true
break
}
}
Комментарии:
1. в поисках чистого пути :(, что, если у меня есть 5 модалов, я должен повторять одни и те же функции ?
2. вы можете сделать это в одной функции, если хотите. для этого требуется только вернуть активный элемент из дочернего компонента, а затем одну функцию, содержащую инструкцию switch, чтобы отфильтровать, какой компонент повторно отправить