Vue + VUEX + 타입 스크립트 + Vue 라우터컴포넌트가 파괴되지 않음
Vue.js 버전= 2 . 3 . 3
모두에게 질문하다.폼 입력에 기반한 데이터 목록을 포함하는 json을 가지고 있습니다.양식 입력에는 모델이 바인딩되어 있으며 기본적으로 앱 상태 트롤 커밋을 업데이트합니다.
체크박스 목록을 렌더링하는 컴포넌트가 있습니다.한 페이지에는 1개의 인스턴스가 있고 다음 페이지에는 3개의 컴포넌트 인스턴스가 있습니다.각 컴포넌트에는 체크박스 목록이 있고 다른 이름이 있습니다.
1페이지에서 2페이지로 이동할 때 1페이지의 checkbox_list 컴포넌트는 파괴된 라이프 사이클 훅을 기동하지 않습니다(다른 컴포넌트가 기동합니다).
2페이지에는 checkbox_list 타입의 컴포넌트 3개와 그 이름, 모델, 옵션이 있습니다.(data
함수로 초기화됩니다).타입 체크 박스 리스트의 세 번째 컴포넌트가 기동하지 않는다.created
후크, 장착되지 않았거나 장착되지 않았음.렌더링되지만 렌더링되지 않고 이벤트 및 모델이 있으며 vue 디버거에서 모델 배열이 비어 있습니다.문제는 세 번째 컴포넌트 인스턴스(생성된 라이프 사이클 훅이 실행되지 않은 것)에서 체크박스 모델 중 하나를 클릭하면 checkbox_list 컴포넌트 인스턴스의 첫 페이지에서 체크한 모든 것이 모델에 포함되어 있다는 것입니다.
데이터가 해석될 때 구성요소는 기본적으로 루프로 렌더링됩니다.왜 이런 일이 생기는지 아는 사람?고마워요.
제 컴포넌트의 Bellow Code를 참조해 주세요. InputTypes.ts
import Vue from 'vue';
import Component from 'vue-class-component';
import TextInput from './text/TextInput.vue';
import EmailInput from './email/EmailInput.vue';
import RadioGroup from './radio/RadioGroup.vue';
import SelectInput from './select/SelectInput.vue';
import SelectAutocompleteInput from './select/SelectAutocompleteInput.vue';
import PasswordInput from './password/PasswordInput.vue';
import CheckboxGroup from './checkbox/CheckboxGroup.vue';
import AgreementSection from './custom/AgreementSection.vue';
import CvSection from './custom/CVSection.vue';
import SubmitSection from './custom/SubmitSection.vue';
@Component({
name: 'input-types',
props: ['field', 'lastPageIndex'],
components: {
TextInput,
EmailInput,
RadioGroup,
SelectInput,
SelectAutocompleteInput,
PasswordInput,
AgreementSection,
CheckboxGroup,
CvSection,
SubmitSection
},
watch: {
'$route'($to, $from) {
let clearFields = this['clearFields'];
clearFields();
}
}
})
export default class InputsTypes extends Vue {
conditionalFields: object = {fields: []};
clearFields(): void {
this.$set(this.conditionalFields, 'fields', []);
}
changeHandler(fields): void {
this.$set(this.conditionalFields, 'fields', fields);
}
updateModelValue(data): void {
console.log(data);
}
}
InputTypes.vue
<!-- InputTypesComponent -->
<template>
<div>
<text-input v-if="field.type == 'text'" :field="field"></text-input>
<email-input v-else-if="field.type == 'email'" :field="field"></email-input>
<checkbox-group v-else-if="field.type == 'checkbox_list'" :field="field"></checkbox-group>
<radio-group v-else-if="field.type == 'radio'" :field="field" :onChange="changeHandler"></radio-group>
<select-input v-else-if="field.type == 'select'" :field="field" :onChange="changeHandler"></select-input>
<select-autocomplete-input v-else-if="field.type == 'select_autocomplete'" :field="field" :onChange="changeHandler"></select-autocomplete-input>
<password-input v-else-if="field.type == 'password'" :field="field"></password-input>
<agreement-section v-else-if="field.type == 'agreement'" :field="field"></agreement-section>
<div v-else-if="field.type == 'complex_inputs'">
<label>{{field.label}}</label>
<div v-for="option, key in field.options" :key="key">
<input-types :field="option" :onChange="changeHandler"></input-types>
</div>
</div>
<cv-section v-else-if="field.type == 'cv_section'" :field="field"></cv-section>
<submit-section v-else-if="field.type == 'next_page'" :field="field" :lastPageIndex="lastPageIndex"></submit-section>
<div v-if="conditionalFields.fields" v-for="field, key in conditionalFields.fields" :key="key">
<input-types :field="field" :onChange="changeHandler"></input-types>
</div>
</div>
</template>
<script lang="ts">
import InputsTypes from './InputsTypes.ts'
export default InputsTypes
</script>
CheckboxGroup.ts
import Vue from 'vue';
import Component from 'vue-class-component';
@Component({
name: 'checkbox-group',
props: ['field'],
watch: {
selected: (e) => {
console.log(e);
}
},
created(): void {
let predefinedSelected: Array<string> = [];
let data: object = {
'name': this.$props.field.name,
'value': predefinedSelected
};
let updateState = this['updateState'];
updateState(data);
}
})
export default class CheckboxGroup extends Vue {
updateStore(): void {
let data: object = {
'name': this.$props.field.name,
'value': this['selected']
};
this.updateState(data);
}
updateState(data): void {
this.$store.commit('SIMPLE_FIELD_UPDATE', data);
}
data(): object {
let predefinedSelected: Array<string> = this.$props.field.selected || [];
return {
selected: []
}
}
created(): void {
console.log('created');
}
mounted(): void {
console.log('mounted');
}
destroyed(): void {
console.log('destroyed');
}
}
CheckboxGroup.vue
<template>
<div class="checkbox-group">
<div class="row" v-if="field.label">
<div class="col">
{{field.label}}
</div>
</div>
<div class="row">
<div class="form-check col-3" v-for="option, key in field.options" :key="key">
<label class="form-check-label">
<input class="form-check-input" v-model="selected" @change="updateStore" type="checkbox" :name="field.name" :value="option.label"/>
{{option.label}}
</label>
</div>
</div>
</div>
</template>
<script lang="ts">
import CheckboxGroup from './CheckboxGroup.ts'
export default CheckboxGroup
</script>
이는 데이터를 기반으로 런타임에 형태를 변경할 수 있는 구성 요소를 만들 수 있는 가변 구성 요소에 매우 적합합니다.
따라서 복합 유형을 자체 구성요소에 추가한 다음 복합 구성요소 대신input-types
사용만 하면 됩니다.
<component :is="field.type" :field="field"></component>
어디에 쓰든
<input-types :field="field"></input-types>
따라서 field.type이 컴포넌트 라벨과 일치하는지 확인해야 합니다.text-input
component field.type은 다음과 같아야 합니다.text-input
.
도움이 필요하시면 말씀하세요.
이것은 진짜 문제가 무엇인지 읽고 이해하려고 시도하는 매우 큰 코드 설명/세트입니다.앞으로는 가능한 한 간단한 설명/상황을 시도해 볼 것을 제안할 수 있습니다.
문제의 원인이 v-for와 v-if의 동일한 요소에서의 상호 작용과 관련이 있다고 생각합니다.요소의 각 됩니다.v-if는 v-for의 v-for이다.를 대신 v-if로 입니다.<template>
.v-for는 v-for를 실행합니다.
https://vuejs.org/v2/guide/list.html#v-for-with-v-if
그 문제는 쉽게 해결되었다.문제는 URL을 기반으로 뷰를 변경하고 여러 컴포넌트를 렌더링하고 있었는데 일부 컴포넌트는 뷰에서 영속적이어서 Vue는 이전 뷰에서 필요한 컴포넌트와 동일한 컴포넌트로 간주했습니다. 저는 '어느 정도'를 했습니다.key
페이지 컴포넌트와 비교하기 때문에 이 상황에서는 다른 컴포넌트로 취급되며 페이지 컴포넌트 내부에서는 얄팍한 비교가 이루어지지 않습니다.
결론:열쇠 잊지 마
언급URL : https://stackoverflow.com/questions/44187158/vue-vuex-typescript-vue-router-component-not-destroyed
'programing' 카테고리의 다른 글
로컬 검색 v-data-table Vuetify (0) | 2022.08.09 |
---|---|
포장된 구조물은 휴대 가능합니까? (0) | 2022.08.09 |
Vuetify v-data-table에서 필터링된 어레이를 가져오는 방법 (0) | 2022.07.21 |
vue-loader의 핫 새로고침은 템플릿의 구조 변경 시에만 작동함 (0) | 2022.07.21 |
네임스페이스를 찾을 수 없거나 getters.default가 비어 있는 Vuex 모듈 등록 문제 (0) | 2022.07.21 |