터미널을 사용하여 Dispatched 액션을 테스트하면 Redux-logger에 내 상태가 올바르게 업데이트되고 있음이 표시됩니다. 그러나 내 구성 요소가 상태 변경의 결과로 다시 렌더링되지 않습니다. 나는 재 렌더링하지 않는 구성 요소에 관한 SO 응답을 살펴 보았습니다. 대다수의 응답에서는 주 (State)가 변형되고 있다고 주장합니다. 결과적으로 Redux는 다시 렌더링하지 않습니다. 그러나 Lodash의 병합을 사용하여 객체를 깊게 훑어보고, 수정 된 객체를 반환하지 않는다고 확신합니다. (아래 첨부 된 스 니펫을 참조하십시오)Reux Reduction Store를 업데이트했지만 구성 요소가 다시 렌더링되지 않습니다.
당신의 충고를 듣고, 내 머리카락을 꺼내고 싶습니다!
const usersReducer = (state = {}, action) => {
Object.freeze(state); // avoid mutating state
console.log(state);
// returns an empty object
let newState = merge({}, state);
console.log(newState);
// returns my state with my dispatched action object inside already???
// newState for some reason already has new dispatched action
switch (action.type) {
case RECEIVE_USER:
let newUser = {[action.user.id] = action.user};
return merge(newUser, newUser);
case RECEIVE_USERS:
newState = {};
action.users.forEach(user => {
newState[user.id] = user;
});
return merge({}, newState);
default:
return state;
}
};
는 컨테이너 요소가
import { connect } from 'react-redux';
import { receiveUsers, receiveUser, refreshAll, requestUsers, requestUser } from '../../actions/user_actions';
import allUsers from '../../reducers/selectors';
import UserList from './user_list';
const mapStateToProps = (state) => ({
users: allUsers(state), // allUsers (selector that takes the state specfically the user Object and returns an array of user Objects)
state
});
const mapDispatchToProps = (dispatch) => ({
requestUser:() => dispatch(requestUser()),
requestUsers:() => dispatch(requestUsers()),
receiveUsers: (users) => dispatch(receiveUsers(users)),
receiveUser: (user) => dispatch(receiveUser(user)),
refreshAll: (users) => dispatch(refreshAll(users))
});
export default connect(
mapStateToProps,
mapDispatchToProps
)(UserList);
는 표상적인 반응 성분 반작용
,210
는
import { createStore, applyMiddleware } from 'redux';
import createLogger from 'redux-logger';
import RootReducer from '../reducers/root_reducer';
const logger = createLogger();
const configureStore = (preloadedState = {}) => {
return createStore(
RootReducer,
preloadedState,
applyMiddleware(logger));
};
// const configureStore = createStore(rootReducer, applyMiddleware(logger));
// oddly enough, when I have the store as a constant and not a function that returns the store constant, dispatching actions through the terminal will correctly update the state and rerender the component
export default configureStore;
가 선택기
const allUsers = ({ users }) => {
return Object.keys(users).map(id => (
users[id]
));
};
export default allUsers;
구성 요소 코드를 추가 할 수 있습니까? 구성 요소를 상점에 연결하는 방법에 문제가 될 수 있습니다. – Mustafa
그것은 귀하의 문제와 관련이 없을 수 있지만 귀하의 병합 사용법 중 어떤 것도 제게 의미가 없습니다. 정확히 무엇을 성취하기를 기대합니까? 스 플랫을 사용하는 것이 좋습니다. 'return {... state, x : 42}' –
저장소에'usersReducer'를 어디에 추가합니까? 저장소 상태가 변경되면 구성 요소'mapStateToProps'가 호출되는지 확인할 수 있습니까? 그렇지 않으면 감속기가 제대로 실행되지 않을 수 있습니다. – Mustafa