Reactjs получает событие из магазина с гибким
Привет, я на самом деле пытаюсь разработать несколько приложений, использующих Flux, реагировать и плавно, и я сталкиваюсь с проблемой при работе с магазинами.
Фактически, я могу отправлять информацию в мой магазин с помощью действий, но я не знаю, как получить результат this.emitChange в магазинах внутри моего компонента, чтобы обновить экран.
Что я должен добавить в свой компонент, чтобы обновить мой список?
Вот мой компонент:
import React from 'react';
class Client extends React.Component {
constructor (props) {
super(props);
this.myListView = [];
}
add(e){
this.context.executeAction(function (actionContext, payload, done) {
actionContext.dispatch('ADD_ITEM', {name:'toto'});
});
}
render() {
return (
<div>
<h2>Client</h2>
<p>List of all the clients</p>
<button onClick={this.add.bind(this)}>Click Me</button>
<ul>
{this.myListView.map(function(title) {
return <li key={name}>{name}</li>;
})}
</ul>
</div>
);
}
}
Client.contextTypes = {
executeAction: React.PropTypes.func.isRequired
};
export default Client;
Вот мой магазин
import BaseStore from 'fluxible/addons/BaseStore';
class ListStore extends BaseStore {
constructor(dispatcher) {
super(dispatcher);
this.listOfClient = [];
}
dehydrate() {
return {
listOfClient: this.listOfClient
};
}
rehydrate(state) {
this.listOfClient = state.listOfClient;
}
addItem(item){
this.listOfClient.push(item);
this.emitChange();
}
}
ListStore.storeName = 'ListStore';
ListStore.handlers = {
'ADD_ITEM': 'addItem'
};
export default ListStore;
ОБНОВИТЬ
this.setState не очень хорошо применяется
_onStoreChange() {
console.log(this.getStoreState()) // gives me the good list
this.setState(this.getStoreState()); // doesn't update the list, this.myListView gives [] always
}
1 ответ
Вы, вероятно, хотите поставить myListView
в состояние компонента и заполнить его из хранилища при создании экземпляра.
Таким образом, ваш компонент будет выглядеть примерно так:
import ListStore from '../stores/ListStore';
class MyComponent extends React.Component {
static contextTypes = {
getStore: React.PropTypes.func.isRequired,
executeAction: React.PropTypes.func.isRequired
}
constructor(props) {
super(props);
this.state = this.getStoreState();
this.boundChangeListener = this._onStoreChange.bind(this);
}
getStoreState () {
return {
myListView: this.context.getStore(ListStore).getItems()
}
}
componentDidMount () {
this.context.getStore(ListStore).addChangeListener(this.boundChangeListener);
}
componentWillUnmount () {
this.context.getStore(ListStore).removeChangeListener(this.boundChangeListener);
}
_onStoreChange () {
this.setState(this.getStoreState());
}
add(e){
this.context.executeAction(function (actionContext, payload, done) {
actionContext.dispatch('ADD_ITEM', {name:'toto'});
});
}
render () {
return (
<div>
<h2>Client</h2>
<p>List of all the clients</p>
<button onClick={this.add.bind(this)}>Click Me</button>
<ul>
{this.state.myListView.map(function(title) {
return <li key={name}>{name}</li>;
})}
</ul>
</div>
);
}
}
Таким образом, вы будете слушать изменения и запускать setState
на компоненте, вызывая повторную визуализацию.
Обновление до add
метод
В приведенном выше исходном коде я не уверен, что способ, которым выполняется действие при нажатии, является правильным. Возможно, попробуйте:
add(e) {
this.context.executeAction(function(actionContext, payload, done) {
actionContext.dispatch('ADD_ITEM', payload);
done();
}, {name: 'toto'});
}