>웹 프론트엔드 >View.js >Vue 오류: $set 메서드를 올바르게 사용하여 중첩 속성을 업데이트할 수 없습니다. 어떻게 해결하나요?

Vue 오류: $set 메서드를 올바르게 사용하여 중첩 속성을 업데이트할 수 없습니다. 어떻게 해결하나요?

PHPz
PHPz원래의
2023-08-27 10:33:541477검색

Vue 오류: $set 메서드를 올바르게 사용하여 중첩 속성을 업데이트할 수 없습니다. 어떻게 해결하나요?

Vue 오류: $set 메서드를 올바르게 사용하여 중첩 속성을 업데이트할 수 없습니다. 해결 방법은 무엇입니까?

Vue를 개발하다 보면 중첩된 속성의 값을 업데이트해야 하는 경우가 많습니다. 일반적으로 Vue에서 제공하는 $set 메소드를 사용하여 속성 값을 업데이트할 수 있습니다. 그러나 때로는 $set 메서드를 올바르게 사용하여 중첩 속성을 업데이트할 수 없어 오류가 발생하는 상황이 발생합니다. 이 문서에서는 이 문제의 원인을 설명하고 해결 방법을 제공합니다.

먼저 구체적인 코드 예시를 살펴보겠습니다. 데이터 속성 dataObj가 포함된 Vue 구성 요소가 있고 그 안에 중첩된 속성 NestedObj가 있다고 가정해 보겠습니다.

<template>
  <div>
    <p>嵌套属性的值为:{{ dataObj.nestedObj }}</p>
    <button @click="updateNestedObj">更新嵌套属性</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      dataObj: {
        nestedObj: '默认值'
      }
    };
  },
  methods: {
    updateNestedObj() {
      this.$set(this.dataObj, 'nestedObj', '新值');
    }
  }
};
</script>

이 예에서 버튼을 클릭하면 NestedObj 속성의 값이 새 값으로 업데이트되어야 합니다. 그러나 이 코드를 실행하면 다음과 같은 오류가 발생합니다. TypeError: Cannot Convert undefine or null to object.

이 오류 보고서에는 두 가지 이유가 있습니다. 먼저 $set 메소드를 사용할 때 중첩된 속성의 상위 객체가 객체로 초기화되었는지 확인해야 합니다. 즉, 정의되지 않았거나 null 개체에 중첩된 속성을 직접 만들 수 없습니다.

둘째, Vue의 반응형 시스템은 중첩된 속성의 변경 사항을 감지하는 데 한계가 있습니다. $set 메소드를 사용하여 속성을 추가하거나 업데이트하면 Vue는 중첩된 속성의 변경 사항을 감지할 수 없으며 변경 사항을 뷰에 올바르게 적용할 수 없습니다.

이 문제를 해결하려면 다음 두 가지 옵션 중 하나를 선택할 수 있습니다.

첫 번째 해결 방법은 $emit 메서드를 사용하여 하위 구성 요소의 속성 변경 사항을 상위 구성 요소에 전달한 다음 상위 구성 요소의 $set 메서드를 사용하여 해당 중첩 속성을 업데이트하는 것입니다. 이것의 장점은 상위 구성 요소의 데이터가 항상 반응하도록 보장하여 뷰의 일관성을 보장할 수 있다는 것입니다. 코드 예시는 다음과 같습니다.

// 子组件
<template>
  <div>
    <p>嵌套属性的值为:{{ nestedObj }}</p>
    <button @click="updateNestedObj">更新嵌套属性</button>
  </div>
</template>

<script>
export default {
  props: ['nestedObj'],
  methods: {
    updateNestedObj() {
      this.$emit('update:nestedObj', '新值');
    }
  }
};
</script>

// 父组件
<template>
  <div>
    <child-component :nestedObj="dataObj.nestedObj" @update:nestedObj="updateNestedObj"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      dataObj: {
        nestedObj: '默认值'
      }
    };
  },
  methods: {
    updateNestedObj(newValue) {
      this.$set(this.dataObj, 'nestedObj', newValue);
    }
  }
};
</script>

두 번째 옵션은 중첩된 속성의 참조를 변경하여 업데이트하는 것입니다. 새 객체를 생성하고 Object.sign() 메서드를 사용하여 이전 속성을 새 객체에 복사한 다음 새 객체를 참조하여 이전 객체를 대체할 수 있습니다. 이것의 장점은 Vue가 중첩된 속성의 변경 사항을 올바르게 감지하고 변경 사항을 뷰에 적용할 수 있다는 것입니다. 코드 예제는 다음과 같습니다.

<template>
  <div>
    <p>嵌套属性的值为:{{ dataObj.nestedObj }}</p>
    <button @click="updateNestedObj">更新嵌套属性</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      dataObj: {
        nestedObj: '默认值'
      }
    };
  },
  methods: {
    updateNestedObj() {
      this.dataObj = Object.assign({}, this.dataObj, {
        nestedObj: '新值'
      });
    }
  }
};
</script>

요약하자면, 중첩 속성을 업데이트하기 위해 $set 메서드를 올바르게 사용할 수 없는 경우 $emit 메서드를 사용하거나 속성 참조를 변경하여 이 문제를 해결할 수 있습니다. 이를 통해 코드가 중첩된 속성을 올바르게 업데이트하고 뷰 일관성을 유지하도록 보장합니다.

위 내용은 Vue 오류: $set 메서드를 올바르게 사용하여 중첩 속성을 업데이트할 수 없습니다. 어떻게 해결하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.