Я просто делаю простое приложение для изучения асинхронности с помощью redux. У меня все заработало, теперь я просто хочу отобразить фактическое состояние на веб-странице. Теперь, как мне получить доступ к состоянию магазина в методе рендеринга?
Вот мой код (все на одной странице, потому что я только учусь):
const initialState = {
fetching: false,
fetched: false,
items: [],
error: null
}
const reducer = (state=initialState, action) => {
switch (action.type) {
case "REQUEST_PENDING": {
return {...state, fetching: true};
}
case "REQUEST_FULFILLED": {
return {
...state,
fetching: false,
fetched: true,
items: action.payload
}
}
case "REQUEST_REJECTED": {
return {...state, fetching: false, error: action.payload}
}
default:
return state;
}
};
const middleware = applyMiddleware(promise(), thunk, logger());
const store = createStore(reducer, middleware);
store.dispatch({
type: "REQUEST",
payload: fetch('http://localhost:8000/list').then((res)=>res.json())
});
store.dispatch({
type: "REQUEST",
payload: fetch('http://localhost:8000/list').then((res)=>res.json())
});
render(
<Provider store={store}>
<div>
{ this.props.items.map((item) => <p> {item.title} </p> )}
</div>
</Provider>,
document.getElementById('app')
);
Итак, в методе рендеринга состояния я хочу вывести все item.title
из магазина.
благодаря
react-redux
библиотеки. Я настоятельно рекомендую вам улучшить свое понимание redux с помощью бесплатного курса автора: egghead.io/courses/getting-started-with-reduxstore.getState()
действительно читаете состояние из вашего магазина. redux.js.org/docs/api/Store.html#getStateОтветы:
Вы должны создать отдельный компонент, который будет прослушивать изменения состояния и обновляться при каждом изменении состояния:
import store from '../reducers/store'; class Items extends Component { constructor(props) { super(props); this.state = { items: [], }; store.subscribe(() => { // When state will be updated(in our case, when items will be fetched), // we will update local component state and force component to rerender // with new data. this.setState({ items: store.getState().items; }); }); } render() { return ( <div> {this.state.items.map((item) => <p> {item.title} </p> )} </div> ); } }; render(<Items />, document.getElementById('app'));
источник
store
определить здесь переменную?store
переменная - это экземпляр хранилища redux.store
импорт для ясности.import store from '../reducers/store';
. иstore.js
будет содержатьconst createStoreWithMiddleware = applyMiddleware(thunkMiddleware,promise)(createStore); export default createStoreWithMiddleware(reducers);
Импортировать
connect
изreact-redux
и использовать его для связи компонента с состояниемconnect(mapStates,mapDispatch)(component)
import React from "react"; import { connect } from "react-redux"; const MyComponent = (props) => { return ( <div> <h1>{props.title}</h1> </div> ); } }
Наконец, вам нужно сопоставить состояния с реквизитами, чтобы получить к ним доступ с помощью
this.props
const mapStateToProps = state => { return { title: state.title }; }; export default connect(mapStateToProps)(MyComponent);
Только те штаты, которые вы отображаете, будут доступны через
props
Посмотрите этот ответ: https://stackoverflow.com/a/36214059/4040563
Для дальнейшего чтения: https://medium.com/@atomarranger/redux-mapstatetoprops-and-mapdispatchtoprops-shorthand-67d6cd78f132
источник
mapDispatchToProps
). Если вы пытаетесь получить то, что уже есть в магазине, не отправляя еще один цикл выборки, вам придется использовать либоsubscribe
либоgetState
наstore
.Вам нужно использовать,
Store.getState()
чтобы узнать текущее состояние вашего Магазина.Для получения дополнительной информации о
getState()
просмотре этого короткого видео.источник
this.props.items
наstore.getState().items
? Когда я это сделал, он не выводилitem.title
.let store = createStore(todoApp);
внутри,index.js
и я хочу получить доступstore
внутрьApp.js
- как это сделать?Вы хотите сделать больше, чем просто
getState
. Вы хотите реагировать на изменения в магазине.Если вы не используете response-redux, вы можете сделать это:
function rerender() { const state = store.getState(); render( <div> { state.items.map((item) => <p> {item.title} </p> )} </div>, document.getElementById('app') ); } // subscribe to store store.subscribe(rerender); // do initial render rerender(); // dispatch more actions and view will update
Но лучше использовать react-redux. В этом случае вы используете Provider, как вы упомянули, но затем используете connect для подключения вашего компонента к магазину.
источник
Если вы хотите выполнить мощную отладку, вы можете подписаться на каждое изменение состояния и приостановить приложение, чтобы подробно узнать, что происходит, следующим образом.
store.jsstore.subscribe( () => { console.log('state\n', store.getState()); debugger; });
Поместите это в файл, где вы это делаете
createStore
.Чтобы скопировать
state
объект из консоли в буфер обмена, выполните следующие действия:Щелкните правой кнопкой мыши объект в консоли Chrome и выберите «Сохранить как глобальную переменную» в контекстном меню. В качестве имени переменной он вернет что-то вроде temp1.
У Chrome также есть
copy()
метод, поэтомуcopy(temp1)
в консоли следует скопировать этот объект в буфер обмена.https://stackoverflow.com/a/25140576
https://scottwhittaker.net/chrome-devtools/2016/02/29/chrome-devtools-copy-object.html
Вы можете просмотреть объект в программе просмотра json, например: http://jsonviewer.stack.hu/
Здесь вы можете сравнить два объекта json: http://www.jsondiff.com/
источник