>  기사  >  웹 프론트엔드  >  React의 프록시: 당신에게 필요한지 몰랐던 교활한 국가 스파이

React의 프록시: 당신에게 필요한지 몰랐던 교활한 국가 스파이

PHPz
PHPz원래의
2024-08-26 21:42:18816검색

Proxies in React: The Sneaky State Spy You Didn’t Know You Needed

Javascript Proxy에 대해 들어보셨나요? useReducer를 React 컴포넌트 내부에서 사용하여 교체했습니다.

이 게시물에서는 프록시를 활용하여 중첩 상태의 변경 사항을 원활하게 감지하고 구성 요소를 최신 상태로 유지하며 수동 딥 클로닝 및 기타 문제를 해결하는 방법을 보여 드리겠습니다.

프록시의 가장 큰 장점은 무엇입니까?

JavaScript의 프록시는 속성 가져오기, 설정 또는 삭제와 같이 객체에 대해 수행되는 작업을 가로채서 사용자 정의할 수 있는 슈퍼 스파이와 같습니다. 따라서 심층 비교나 불필요한 재렌더링 없이 중첩된 객체에서도 상태 변경을 수신하는 데 적합합니다.

우리가 목표로 하는 것은 다음과 같습니다.

  • 중첩 속성이 변경되면 자동으로 업데이트되는 반응형 상태입니다.
  • 더 이상 React 업데이트를 트리거하기 위해 깊이 중첩된 객체를 수동으로 복제할 필요가 없습니다.
  • 최소한의 노력으로 배열 및 중첩 구조를 처리합니다.

시작하기: 프록시 설정

React와의 통합에 대해 알아보기 전에 중첩된 개체를 처리하는 프록시를 설정하는 방법을 자세히 살펴보겠습니다. 아이디어는 간단합니다. 변경 사항을 감시하고 필요할 때 업데이트를 트리거할 수 있는 프록시에 초기 상태를 래핑하는 것입니다.

기본적인 예는 다음과 같습니다.

function createNestedProxy(state, onChange) {
  if (typeof state !== 'object' || state === null) {
    return state; // Return primitive values as-is
  }

  const handler = {
    get(target, property) {
      const value = target[property];
      if (typeof value === 'object' && value !== null) {
        return createNestedProxy(value, onChange); // Recursively proxy nested objects
      }
      return value;
    },
    set(target, property, value) {
      if (target[property] === value) return true; // No change, no update

      if (typeof value === 'object' && value !== null) {
        value = createNestedProxy(value, onChange); // Proxy nested objects
      }
      target[property] = value;
      onChange(); // Trigger the change callback
      return true;
    }
  };

  return new Proxy(state, handler);
}

프록시와 React 통합

이제 재미있는 부분이 나옵니다. 이 프록시 설정을 React 후크에 통합하는 것입니다! 초기 상태를 래핑하고 모든 변경 사항이 자동으로 React 리렌더링을 트리거하도록 하는 useProxyState 후크를 생성하겠습니다.

import { useState, useEffect } from 'react';

export function useProxyState(initialState) {
  const [state, setState] = useState(initialState);

  useEffect(() => {
    // Create a proxy with the onChange callback to trigger state updates
    const proxiedState = createProxyState(state, st => {
      // Trigger a React state update
      console.log('state updated');
      setState({ ...proxiedState });
    });

    // Set the state to the proxied state on the first render
    setState(proxiedState);
  }, []);

  return state;
}

이를 반응 구성 요소에 사용해 보겠습니다.

import { useProxyState } from './proxy';

function App() {
  const state = useProxyState({
    name: "Alice",
    details: {
      age: 25,
      hobbies: ["reading", "coding"]
    }
  });

  const updateName = () => {
    state.name = "Bob";
  };

  const addHobby = () => {
    state.details.hobbies.push("gaming");
  };

  return (
    <div>
      <h1>Name: {state.name}</h1>
      <h2>Age: {state.details.age}</h2>
      <h3>Hobbies:</h3>
      <ul>
        {state.details.hobbies.map((hobby, index) => (
          <li key={index}>{hobby}</li>
        ))}
      </ul>
      <button onClick={updateName}>Update Name</button>
      <button onClick={addHobby}>Add Hobby</button>
    </div>
  );
}

함정과 주의해야 할 사항

프록시는 강력하지만 몇 가지 주의 사항이 있습니다.

  • 매우 크거나 깊게 중첩된 개체의 성능에 주의하세요.
  • JavaScript의 프록시는 이를 지원하지 않는 환경(예: 구형 브라우저)에서는 작동하지 않습니다.

위 내용은 React의 프록시: 당신에게 필요한지 몰랐던 교활한 국가 스파이의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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