Vue.js에 활성화된 속성 동적 추가
16244 단어 JavaScriptVue.js
Vue.js의 양방향 귀속
Vue.js에서
v-model
를 사용하여 양방향 귀속을 실현할 수 있습니다.예를 들어 세 가지 옵션을 고려한 복선상자.이 예는 Vue입니다.js의 단일 구성 요소로 원본을 기술합니다.
v-model의 양방향 귀속 사용하기
input
레이블 3개 쓰기data()
에서 각input
의 상태에 대응하는 속성을 정의input
태그에 속성v-model
을 추가하여 해당 속성sample.vue
<template>
<ul>
<li>
<input type="checkbox" v-model="option1" />
<label>選択肢1</label>
</li>
<li>
<input type="checkbox" v-model="option2" />
<label>選択肢2</label>
</li>
<li>
<input type="checkbox" v-model="option3" />
<label>選択肢3</label>
</li>
</ul>
</template>
<script>
export default {
data () {
return {
option1: false,
option2: false,
option3: false
}
}
}
</script>
<style scoped>
ul {
list-style: none;
}
</style>
많은 선택 문제 & 여러 UI 요소를 하나의 속성에 대응시키려는 문제
상기 예에서 보듯이 선택항이 3가지라면 각 선택항에 대응하는 속성
v-model
을 정의하여 대응하면 충분하다.그렇다면 100개의 선택 항목이 있는 경우는 어떨까.100개의 속성을 미리 정의하는 것은 불가능한 것이 아니지만, 쓰다 보면 어리석어진다.규격에 따라 아마 100개 중 몇 개만이 실제로 사용되었을 것이다.
사용자가 터치한 확인란 상태를 관리해야 합니다.
또한 체크 상자를 만들 때 전체 줄을 삭제하려고 할 수도 있습니다.이때 문제가 발생한 것은 다음과 같다.
-
ul
또는 label
컴포넌트 등은 지정할 수 없음v-model
- 하나의 속성에 대해 두 개의 트리거가 있습니다(체크 상자 자체에서 탭을 클릭하고 클릭).기본 방침으로 다음과 같은 생각을 할 수 있다.
준비
checked
이러한 대상은 checked
에 사용자가 만진 복선상자에 대응하는 속성을 추가v-on:click
와 같은 활동 트리거를 사용하여'사용자가 만졌는지'v-on:click
특정 속성에 해당하는 UI 요소 지정동적 활동 속성 추가(실패 예)
이것은 내가 반한 예다.
나는 단순히 복선상자
selected[option] = true
를 클릭하면 된다고 생각한다.input
와 label
에 클릭 이벤트를 추가selected
객체에 option1
등의 요소를 추가하여 선택 여부를 판단하는 데 사용<template>
<ul>
<li>
<input
type="checkbox"
v-model="selected.option1"
v-on:click="select('option1')" />
<label
v-on:click="select('option1')">
選択肢1
</label>
</li>
<li>
<input
type="checkbox"
v-model="selected.option2"
v-on:click="select('option2')" />
<label
v-on:click="select('option2')">
選択肢2
</label>
</li>
<li>
<input
type="checkbox"
v-model="selected.option3"
v-on:click="select('option3')" />
<label
v-on:click="select('option3')">
選択肢3
</label>
</li>
</ul>
</template>
<script>
export default {
data () {
return {
selected: {}
}
},
methods: {
select (option) {
console.log(option)
if (!this.selected[option]) {
this.selected[option] = true
} else {
this.selected[option] = !this.selected[option]
}
}
}
}
</script>
<style scoped>
ul {
list-style: none;
}
</style>
주안점
이벤트를 눌렀을 때 이동하는 것은 아래 코드입니다.아무래도 좋아 보이네.
if (!this.selected[option]) {
this.selected[option] = true
} else {
this.selected[option] = !this.selected[option]
}
결실
왜 안 풀리지?
조사해 보니 문서는 아래와 같다.
"현대 자바스크립트의 제한(Object.observe의 포기)Vuejs에서 속성을 추가하거나 삭제할 수 없습니다.Vue.인스턴스를 초기화하는 동안 Getter/setter 변환 처리를 수행하려면 Vue를 변환하고 다시 활성화하기 위해 속성이 데이터 대상에 존재해야 합니다."
"에?이렇게 생각하면서 계속 읽으면...
Vue는 생성된 인스턴스에 대해 새 루트 레벨의 활성화 속성을 동적으로 추가할 수 없습니다.하지만 Vue.set(object,key,value) 방법을 사용하여 플러그인 대상에 재활성 속성을 추가할 수 있습니다
이런 견해가 있다.활동 객체를 동적으로 추가하려면
Vue.set
을 사용해야 합니다.동적 활동 속성 추가(좋은 예)
츤데레 문서에서 구원
Vue.set
을 받았다.this.selected[option] = true
의 부분을 개작해 보세요.단일 파일 구성 요소인 경우 this.$set
에서 호출할 수 있습니다.sample.vue
<template>
<ul>
<li>
<input
type="checkbox"
v-model="selected.option1"
v-on:click="select('option1')" />
<label
v-on:click="select('option1')">
選択肢1
</label>
</li>
<li>
<input
type="checkbox"
v-model="selected.option2"
v-on:click="select('option2')" />
<label
v-on:click="select('option2')">
選択肢2
</label>
</li>
<li>
<input
type="checkbox"
v-model="selected.option3"
v-on:click="select('option3')" />
<label
v-on:click="select('option3')">
選択肢3
</label>
</li>
</ul>
</template>
<script>
export default {
data () {
return {
selected: {}
}
},
methods: {
select (option) {
console.log(option)
if (!this.selected[option]) {
this.$set(this.selected, option, true)
} else {
this.selected[option] = !this.selected[option]
}
}
}
}
</script>
<style scoped>
ul {
list-style: none;
}
</style>
결실
순조롭게 진행되었습니다!
참고 자료
복선상자 등에 대한 귀속괜찮은 문서인 것 같아요.이 있습니다.
label
태그에 for
속성을 추가하면 이번처럼 번거롭지 않겠나.하지만 생각은 어딘가에 작용할 거야...!
Reference
이 문제에 관하여(Vue.js에 활성화된 속성 동적 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gyarasu/items/7bc16ec3466f00b2c9fa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)