Preact는 React의 더 나은 대안 중 하나입니다. 물론 크기가 작다는 장점이 있습니다. 이 글에서는 setState의 차이점을 소개합니다.
먼저 React와 Preact의 setState 부분의 구체적인 구현을 분석해 보겠습니다.
(너무 길어서 게으르게 하고 싶으면 그냥 아래로 스크롤해서 결론을 읽어도 됨)
Key code:
// ReactUpdateQueue.jsenqueueSetState: function(publicInstance, partialState) { ... var queue = internalInstance._pendingStateQueue || (internalInstance._pendingStateQueue = []); queue.push(partialState); enqueueUpdate(internalInstance);}
React가 안 되는 걸 볼 수 있어요 setState 중 처리되는 모든 변경 사항은 구성 요소가 업데이트될 때 사용하기 위해 처리 상태 전용 대기열에 직접 배치됩니다.
// ReactCompositeComponent.jsupdateComponent: function( transaction, prevParentElement, nextParentElement, prevUnmaskedContext, nextUnmaskedContext,) { var inst = this._instance; ... var willReceive = false; var nextContext; if (this._context === nextUnmaskedContext) { nextContext = inst.context; } else { nextContext = this._processContext(nextUnmaskedContext); willReceive = true; } var prevProps = prevParentElement.props; var nextProps = nextParentElement.props; if (prevParentElement !== nextParentElement) { willReceive = true; } if (willReceive && inst.componentWillReceiveProps) { ... inst.componentWillReceiveProps(nextProps, nextContext); } // 在此处才计算 nextState var nextState = this._processPendingState(nextProps, nextContext); // 此处传入了 nextProps var shouldUpdate = true; if (!this._pendingForceUpdate) { if (inst.shouldComponentUpdate) { ... shouldUpdate = inst.shouldComponentUpdate( nextProps, nextState, nextContext, ); } else { if (this._compositeType === CompositeTypes.PureClass) { // 敲黑板,知识点 —— 如果你的组件没实现shouldComponentUpdate,那么把React.Component 换成 React.PureComponent 可以获得基础版优化,提高性能。 shouldUpdate = !shallowEqual(prevProps, nextProps) || !shallowEqual(inst.state, nextState); // 浅比较,可以抄去自己改成属性黑/白名单版 } } } ...}// ReactCompositeComponent.js_processPendingState: function(props, context) { // props: nextProps var inst = this._instance; var queue = this._pendingStateQueue; var replace = this._pendingReplaceState; this._pendingReplaceState = false; this._pendingStateQueue = null; if (!queue) { return inst.state; } if (replace && queue.length === 1) { return queue[0]; } var nextState = Object.assign({}, replace ? queue[0] : inst.state); for (var i = replace ? 1 : 0; i < queue.length; i++) { var partial = queue[i]; Object.assign( nextState, typeof partial === 'function' ? partial.call(inst, nextState, props, context) // nextProps : partial, ); } return nextState;}
위 구성 요소 업데이트의 프로세스 코드에서 확인할 수 있습니다.
updateComponent에서 nextState는 componentWillReceiveProps 이후에 계산되므로, 현재 업데이트에서는 componentWillReceiveProps의 setState를 유효하게 사용할 수 있습니다.
_processPendingState에서는 큐의 상태가 중첩됩니다. 수정이 함수 모드인 경우 여기에 전달된 상태 매개변수는 nextState이고 props는 nextProps입니다.
키 코드:
// component.jssetState(state, callback) { let s = this.state; if (!this.prevState) this.prevState = extend({}, s); extend(s, typeof state==='function' ? state(s, this.props) : state); if (callback) (this._renderCallbacks = (this._renderCallbacks || [])).push(callback); enqueueRender(this);}
구현은 간단하고 대략적입니다. This.state는 즉시 다시 작성되며 첫 번째 setState 동안 유지됩니다. 상태를 prevState로 변경합니다. 상태는 즉시 병합되므로 입력 매개변수 상태가 함수인 경우 props는 현재 this.props가 됩니다.
export function renderComponent(component, opts, mountAll, isChild) { ... previousProps = component.prevProps || props, previousState = component.prevState || state, previousContext = component.prevContext || context, ... // if updating if (isUpdate) { component.props = previousProps; component.state = previousState; component.context = previousContext; if (opts!==FORCE_RENDER && component.shouldComponentUpdate && component.shouldComponentUpdate(props, state, context) === false) { skip = true; } else if (component.componentWillUpdate) { component.componentWillUpdate(props, state, context); } component.props = props; component.state = state; component.context = context; } ...}
업데이트 프로세스 전에 이전 상태가 추출되고 shouldComponentUpdate 및 componentWillUpdate가 새 값으로 복원됩니다. 따라서 shouldComponentUpdate 수명 주기에서 this.props는 일관된 prevProps를 얻습니다. React의 논리와 일치하지 않습니다.
동일 사항:
ComponentWillReceiveProps의 setState가 nextState에 적용됩니다.
shouldComponentUpdate의 setState는 nextState에 적용되지 않지만 들어오는 nextState는 직접 조작될 수 있습니다.
shouldComponentUpdate 단계의 setState는 최종 상태 값에 영향을 미치지 않지만 나중에 componentWillUpdate의 this.state와 같이 Preact의 this.state 값에 영향을 미칩니다. 즉, 여기서 setState를 안 해도 소용이 없습니다. 단계.
위 내용은 React와 Preact의 setState 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!