위젯 위젯 감속기를 작성하고 렌더 트리를 직렬로 반응시키는 방법을 알아 내는데 어려움을 겪고 있습니다. 결과적으로 반응 감속기를 사용하여 렌더러의 감속기를 렌더 트리의 소품에 매핑 할 수 있습니다.어떻게 반응 - redux와 소품에 redux 저장소에 캡슐화 된 UI 상태를 매핑 할 수 있습니까?
이와 같은 설정을 가정 해보십시오. ====
NameView.jsx:
...
render() {
return <div> Name: {this.props.name} </div>;
}
...
====
NameAction.js:
...
export const CHANGE_NAME = 'CHANGE_NAME';
...
export function changeNameAction(newName) {
return {
type: CHANGE_NAME,
payload: newName,
};
}
====
NameReducer.js:
import { CHANGE_NAME } from './NameAction';
function ui(state = {name: ''}, action) {
switch(action.type) {
case(CHANGE_NAME):
return Object.assign({}, state, {name: action.payload});
break;
default:
return state;
}
}
export default ui;
를 : 나는 어떤 응용 프로그램에서 어디서나 사용할 수있는 NameWidget를 만들기 위해 노력하고있어
NameWidget.js:
import { connect } from 'react-redux';
import { NameView } from './NameView';
const mapStateToProps = (state) => {
return {
name: state.name,
};
};
const NameWidget = connect(
mapStateToProps
)(NameView);
export default NameWidget;
직접 NameWidget을 사용하는 경우 probl em :
NameApp.jsx:
import { createStore } from 'redux';
import app from './NameReducers';
let store = createStore(app);
...
function render() {
return (
<Provider store={store}>
<NameWidget/>
</Provider>
);
}
그러나이 모듈러를 만드는 방법은 없습니다. 나는이 위젯을 다른 어떤 것으로도 넣을 수 없다. 나는이하고 싶어한다고 가정
EncapsulatingView.jsx:
...
render() {
return (
<div>
<NameWidget/>
<SomeOtherReduxWidget/>
</div>
);
}
...
====을
EncapsulatingReducer.js:
import { combineReducers } from 'redux'
import nameWidget from '../name/NameReducer';
import someOtherWidget from '../someOther/SomeOtherReduxWidgetReducer';
export default combineReducers({nameWidget, someOtherWidget});
(I 포함한 나머지 코드 (연결) 및 캡슐화에 대한 createStore는() * 분명 기대합니다.)
이 거의은 모든 캡슐화 된보기의 모든 작업이 고유 한 유형을 가지고있는 한 작동합니다. 하지만 문제는 NameWidget의 mapStateToProps입니다. 조상의 combineReducers()가 자신의 적 - 웅대 한 슈퍼 위젯과 애플리케이션을 정의하는 방법을 어떻게 든에 따라 자손을 -
...
const mapStateToProps = (state) => {
return {
name: state.nameWidget.name,
};
};
...
등등 : 그것은 가게의 섹션에 새 경로를 사용 위에서 변경해야 보정하기 위해 mapStateToProps()를 변경해야합니다. 이렇게하면 코드의 캡슐화와 재사용이 중단되고 반응을 줄이는 방법으로 코드를 처리하는 방법을 알 수 없습니다. combineReducers()를 작성하여 위젯을 정의한 다음 결과 저장소를 해당 위치의 소품으로 매핑하는 방법은 어디에서나 쓸 수 있습니다.
(아무 것도 제시하지 않고 반복 된 combineReducers()가 아래쪽 모양을 생성하지만 mapStateToProps()가 그 모양을 검색하기 위해 하향식 "절대 경로"접근 방식을 사용하는 것으로 보입니다.)
당신이 수출을 계획하십니까
==== : 당신 EncapsulatingReducer.js에서 combineReducers() 기본적으로 때마다, 당신은 EncapsulatingView.js에 uiStorePath 소품을 통과 기억해야 코드를 다른 프로젝트에 추가하거나 동일한 프로젝트의 다른 설정에서 위젯을 다시 사용하려는 의도가 있습니까? – Gennon
단기간은 프로젝트마다 다르지만, 좋은 패턴/해결책이 있다면 잘하면 두 가지를 모두 지원할 것입니다. – jdowdell
정의 된 이름 (양식)을 자체 루트 감속기로 사용하는 [redux-form] (http://redux-form.com/5.3.1/#/getting-started) 모양이 있었습니까? 그런 식으로 구성 요소는 state.form에서 모든 값을 찾습니다. – Gennon