Javascript Proxy에 대해 들어보셨나요? useReducer를 React 컴포넌트 내부에서 사용하여 교체했습니다.
이 게시물에서는 프록시를 활용하여 중첩 상태의 변경 사항을 원활하게 감지하고 구성 요소를 최신 상태로 유지하며 수동 딥 클로닝 및 기타 문제를 해결하는 방법을 보여 드리겠습니다.
JavaScript의 프록시는 속성 가져오기, 설정 또는 삭제와 같이 객체에 대해 수행되는 작업을 가로채서 사용자 정의할 수 있는 슈퍼 스파이와 같습니다. 따라서 심층 비교나 불필요한 재렌더링 없이 중첩된 객체에서도 상태 변경을 수신하는 데 적합합니다.
우리가 목표로 하는 것은 다음과 같습니다.
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 리렌더링을 트리거하도록 하는 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> ); }
프록시는 강력하지만 몇 가지 주의 사항이 있습니다.
위 내용은 React의 프록시: 당신에게 필요한지 몰랐던 교활한 국가 스파이의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!