프록시를 사용하여 양방향 바인딩을 구현하는 방법 소개(코드)

不言
풀어 주다: 2019-03-20 10:08:33
앞으로
1983명이 탐색했습니다.

이 글에서는 프록시를 사용하여 양방향 바인딩을 구현하는 방법(코드)을 소개합니다. 필요한 친구가 참고할 수 있기를 바랍니다.

서문: vue3.0은 Proxy를 사용하여 양방향 바인딩을 구현하므로 먼저 구현 방법을 시도해 보겠습니다.

1 Object.defineProperty 구현

vue2의 원래 구현에서는 Object.defineProperty를 사용하여 집합을 모니터링하지만 배열 설정 값을 직접 첨자로 사용하면 배열을 모니터링할 수 없습니다.

function observe(data) {
  if (!data || typeof data !== 'object') {
      return;
  }
  // 取出所有属性遍历
  Object.keys(data).forEach(function(key) {
      defineReactive(data, key, data[key]);
  });
};
function defineReactive(data, key, val) {
  observe(val); // 监听子属性
  Object.defineProperty(data, key, {
      enumerable: true, // 可枚举
      configurable: false, // 不能再重写defineProperty
      get: function() {
          return val;
      },
      set: function(newVal) {
          console.log('-------通知订阅者--------')
          val = newVal;
      }
  });
}
로그인 후 복사

2 프록시를 사용하여 구현

프록시를 사용하는 원칙은 주로 데이터 값을 프록시하기 위해 새 프록시 개체를 만드는 것입니다. 한 가지 주목할 점은 배열의 메서드 작업에 대해 두 가지 할당이 있다는 것입니다. 작업, 하나 값을 추가하고 해당 길이 값을 한 번에 변경하는 것입니다. Object.defineProperty에서 모니터링할 수 없는 배열 첨자의 경우 프록시는 배열 첨자를 모니터링하여 값을 설정할 수 있습니다.

function observe(data) {
    if (!data || typeof data !== 'object') {
        return;
    }
    // 取出所有属性遍历
    Object.keys(data).forEach(function(_k) {
        // Proxy不允许绑定在非对象上
        if (data[_k] && typeof data[_k] === 'object') {
            data[_k] = defineReactive(data[_k]);
        }
    });
}

function defineReactive(data) {
  return new Proxy(data, {
    set(target, key, value, proxy) {
        // 进行数组操作时,会进行两次set 一次数据改变,一次length改变,两次改变data的值是不变,因此不应该多分发一次消息
      if (
        Object.prototype.toString.call(data) === "[object Array]" &&
        key === "length"
      ) {
        Reflect.set(target, key, value, proxy);
        return true;
      }
      observe(data);
      Reflect.set(target, key, value, proxy);
      console.log('-------通知订阅者--------')
      return true;
    }
  });
로그인 후 복사

이 기사는 여기서 끝났습니다. 더 흥미로운 내용을 보려면 PHP 중국어 웹사이트의 JavaScript Tutorial Video 칼럼을 주목하세요!

위 내용은 프록시를 사용하여 양방향 바인딩을 구현하는 방법 소개(코드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!