Vue.$set 실효 구덩이 문제 발견 및 해결 방안
데이터 필터 추가 가 필요 합 니 다.왼쪽 은 컨트롤 입 니 다.중간 은 조건 이 고 오른쪽 은 값 입 니 다.
컨트롤 에 따라 값 옵션 컨트롤 을 렌 더 링 하기 때 문 입 니 다.
<el-form inline >
<el-form-item style="margin-bottom: 20px;">
<el-select v-model="data[props.prop]" @change="data[props.value] = ''">
<el-option
v-for="item in controls"
:key="item.id"
:value="item.id"
:label="item.label">
</el-option>
</el-select>
</el-form-item>
<el-form-item style="margin-bottom: 20px;">
<el-select v-model="data[props.type]">
<el-option
v-for="item in condition"
:key="item.code"
:value="item.code"
:label="item.name"
></el-option>
</el-select>
</el-form-item>
<el-form-item style="margin-bottom: 20px;">
<FormControl v-if="control" :control="control" :value="data[props.value]" @input="onValueChange" ></FormControl>
<el-input v-else :value="data[props.value]" @input="onValueChange"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-plus" @click="add"></el-button>
</el-form-item>
</el-form>
{
props:{
props: {
type: Object,
default: () => ({
prop: 'prop',
value: 'value',
type: 'type'
})
}
},
data(){
return {
data:{
}
}
},
methods:{
onValueChange(val){
this.$set(this.data, this.props.value, val)
}
}
//...
}
코드 세 션컨트롤 ID 의 불확실 성 으로 인해 모든 data 가 key 를 미리 설정 하지 못 해 자 연 스 럽 게 응답 할 수 없 기 때문에 onValue Change 에서 this.$set 동적 으로 데 이 터 를 추가 하여 응답 을 실현 합 니 다.
재현 하면 값 입력 상자 안의 데이터 가 실시 간 으로 응답 하지 않 는 것 을 발견 할 수 있 습 니 다.
$set 를 사 용 했 는데 테스트 에 응답 하지 못 했 는데 컨트롤 을 바 꾸 면 value 값 이 응답 하지 않 는 다 는 것 을 알 게 되 었 습 니 다.하지만 전환 하기 전에 아무 것 이나 입력 하고 전환 하면 괜 찮 습 니 다.
또 한 차례 조사 한 후에 발견 되 었 다.
<el-select v-model="data[props.prop]" @change="data[props.value] = ''">
@change 이벤트 삭제 후 고장 해결문 제 는 data[props.value]='
Vue 소스 코드 보기
//vue/src/core/observer/index.js
/**
* Set a property on an object. Adds the new property and
* triggers change notification if the property doesn't
* already exist.
*/
export function set (target: Array<any> | Object, key: any, val: any): any {
if (process.env.NODE_ENV !== 'production' &&
(isUndef(target) || isPrimitive(target))
) {
warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`)
}
if (Array.isArray(target) && isValidArrayIndex(key)) {
target.length = Math.max(target.length, key)
target.splice(key, 1, val)
return val
}
if (key in target && !(key in Object.prototype)) {
target[key] = val
return val
}
const ob = (target: any).__ob__
if (target._isVue || (ob && ob.vmCount)) {
process.env.NODE_ENV !== 'production' && warn(
'Avoid adding reactive properties to a Vue instance or its root $data ' +
'at runtime - declare it upfront in the data option.'
)
return val
}
if (!ob) {
target[key] = val
return val
}
defineReactive(ob.value, key, val)
ob.dep.notify()
return val
}
define Reactive 전에 key 가 대상 안에 존재 하 는 지 여 부 를 판단 하고 존재 하면 건 너 뛰 었 음 을 알 수 있 습 니 다.구 덩이 는 Vue.$set 문 서 를 여러 번 뒤 져 보 았 지만$set 가 존재 하 는 key 에 모니터링 대상 을 추가 할 수 없습니다.
data[props.value]=','onValueChange(')로 변경 하여 문 제 를 완벽 하 게 해결 합 니 다.
총결산
Vue.$set 이전에 반드시 대상 내 key 가 존재 하지 않 아야 합 니 다.그렇지 않 으 면 값 만 업데이트 되 고 이 Key 에 응답 모니터링 을 추가 하지 않 습 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Vue Render 함수로 DOM 노드 코드 인스턴스 만들기render에서createElement 함수를 사용하여 DOM 노드를 만드는 것은 직관적이지 않지만 일부 독립 구성 요소의 디자인에서 특수한 수요를 충족시킬 수 있습니다.간단한 렌더링 예는 다음과 같습니다. 또한 v...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.