Как я могу получить новое состояние из сопоставленных реквизитов после отправки действия

Привет, ребята,

Я только начинаю работать с React Redux и работаю над простым грубым приложением.

Я борюсь с проблемой получения текущего состояния хранилища с помощью сопоставленных реквизитов в компоненте mapStateToProps .

В приведенном ниже коде у меня есть создатель действия, обрабатывающий почтовый запрос с тремя этапами.

  • Почтовый запрос
  • Отправка запроса выполнена успешно
  • Почтовый запрос не выполнен
const postClientRequest = (client) => dispatch => {
    dispatch({
        type: clientConstant.POST_CLIENTS.REQUEST,
    })
    return axios.post('http://localhost:5000/client', client)
}

const postClientSuccess = (client) => dispatch => {
    return dispatch({
        type: clientConstant.POST_CLIENTS.SUCCESS,
        payload: client
    })
}

const postClientFailure = (error) => dispatch => {
    return dispatch({
        type: clientConstant.POST_CLIENTS.FAILURE,
        payload: error
    })
}

// action creator contains all the actions for post request
export const postClient = client => dispatch => {

    return dispatch(postClientRequest(client)).then(res => {
        const client = res.data;
        dispatch(postClientSuccess(client));
    }).catch(err => {
        dispatch(postClientFailure(err.message))
    })
}

когда я отправляю действие в свой index.js файл

const client ={
    "firstName":"adam",
    "lastName":"ben",
    "email":"[email protected]",
    "phone":"7939909838720"
  };

store.dispatch(postClient(client)).then(()=>{
    console.log('Get State : ',store.getState())
})

Он отлично работает, и я могу сразу получить текущее состояние магазина.

Скриншот 1 снимок экрана

но когда я отправляю действие в компонент (App.js)

const client ={
    "firstName":"adam",
    "lastName":"ben",
    "email":"[email protected]",
    "phone":"7939909838720"
  };
  const dispatch =useDispatch();

  const ClickBtn=()=>{
    console.log('before Dispatching:',state)
    dispatch(postClient(client)).then(()=>{
      console.log('after Dispatching:',state)
    });
  }

Получить предыдущие значения состояния действия (пустой массив клиентов).

Скриншот 2 снимок экрана

Но когда я передаю магазин App.js и вывожу консоль store.state, я получаю последнее состояние магазина.

 const ClickBtn=()=>{
    console.log('get State from component before Dispatching :',store.getStat())
    console.log('before Dispatching:',state)
    dispatch(postClient(client)).then(()=>{
      console.log('after Dispatching:',state)
      console.log('get State from component after Dispatching :',store.getStat())
    });
  }

Скриншот 3 снимок экрана

Мой вопрос: как я могу получить последнее состояние из сопоставленных реквизитов после отправки действия

Вот мой код

файл client.reducer.js,

const initaileState={
    clients:[],
    loading:true,
    error:""
}
const ClientReducer=(state=initaileState,action)=>{
    switch (action.type) {
        case clientConstant.POST_CLIENTS.REQUEST:
            return {
                ...state,
                error:'',
                loading: true
            }
        case clientConstant.POST_CLIENTS.SUCCESS:
            return {
                ...state,
                clients: [...state.clients,action.payload],
                error:'',
                loading: false
            }
        case clientConstant.POST_CLIENTS.FAILURE:
            return {
                ...state,
                error:action.payload,
                loading: false
            }
        default:
            return state
    }
}

файл client.action.js,

const postClientRequest = (client)=>dispatch => {
     dispatch({
        type: clientConstant.POST_CLIENTS.REQUEST,
    })
    return axios.post('http://localhost:5000/client', client)
}

const postClientSuccess = (client) =>dispatch =>{
    return dispatch({
        type: clientConstant.POST_CLIENTS.SUCCESS,
        payload: client
    })
}

const postClientFailure = (error) =>dispatch =>{
    return dispatch({
        type: clientConstant.POST_CLIENTS.FAILURE,
        payload: error
    })
}

export const postClient = client => dispatch => {

    return dispatch(postClientRequest(client)).then(res => {
        const client = res.data;
        dispatch(postClientSuccess(client));
    }).catch(err => {
        dispatch(postClientFailure(err.message))
    })
}

файл index.js

const store = createStore(combineReducers({clients:ClientReducer}), composeEnhancers(

    applyMiddleware(thunk,Logger)
));
console.log('Get State  before dispatching : ',store.getState());
store.dispatch(postClient(client)).then(()=>{
    console.log('Get State  after dispatching : ',store.getState());
})

ReactDOM.render(
 <Provider store={store}>
    <App store={store} />
  </Provider>,
  document.getElementById('root')
);

//App.js
function App({state,store}) {
  const client ={
    "firstName":"adam",
    "lastName":"ben",
    "email":"[email protected]",
    "phone":"7939909838720"
  };
  const dispatch =useDispatch();

  const ClickBtn=()=>{
    console.log('get State from component before Dispatching :',store.getStat())
    console.log('before Dispatching:',state)
    dispatch(postClient(client)).then(()=>{
      console.log('after Dispatching:',state)
      console.log('get State from component after Dispatching :',store.getStat())
    });
  }
  return (
    <div className="App">
      <header className="App-header">
       <button  onClick={ClickBtn}>Dispatch </button>
      </header>
    </div>
  );
}

const mapStateToProps=state=>{
  return {state}
}

export default connect(mapStateToProps)(App);

person Hâccan listoun    schedule 13.10.2020    source источник


Ответы (1)


Вам нужно вернуть нужные вам значения из состояния хранилища

const mapStateToProps = state => {
  return {
    // you named this property as `clients` in combineReducers
    clients: state.clients
  }
}

тогда они будут доступны в свойствах компонента. Компонент будет прослушивать изменение состояния редукции и автоматически обновлять реквизиты.

//App.js
function App({ state, props }) {
console.log(props.clients)

Кроме того, значение, которое вы передаете компоненту в качестве реквизита, может быть доступно через объект реквизита, а не напрямую.

ReactDOM.render(
 <Provider store={store}>
    <App store={store} />
  </Provider>,
  document.getElementById('root')
);


//App.js
function App({ state, props }) {
console.log(props.store)
person ruslanv    schedule 14.10.2020