react/mobX:最佳实践
react/mobX : best practice
我对 React 和 MobX 还很陌生。我 read/watched 有很多关于反应和与 MobX 结合反应的教程。
我需要创建一个表单,用户可以在其中 select(自动完成)产品。我正在使用 react-select 来做到这一点。当用户 select 使用产品时,界面需要使用 select 产品的位置更新另一个 select(我还没有实现,但它将使用来自位置可观察)。
- 有没有关于如何在 React 元素和 MobX 之间建立通信的 'best practices'?
- 'findProduct'和'findLocationAllocationData '被定义为一个动作。这是正确的吗?
感谢您的帮助!
const {observable, action} = mobx;
const {observer} = mobxReact;
class MyStore {
product = observable({value: null});
locations= observable({value: null,options: [],disabled: true});
findProduct = action((input, callback) => {
//ajax call to get products
// JSON object as an example
callback(null, {
options: [{key: 1, value: 1, label: 'product a'},
{key: 2, value: 2, label: 'product b'}
],
complete: true
})
});
findLocationAllocationData = action(() => {
if (null === this.product.value) {
return;
}
//ajax-call to get the locations and to update the location observable options
}
}
反应内容:
class Well extends React.Component {
render() {
return (
<div className = "well" >
<span className = "well-legend" > {this.props.legend} < /span>
{this.props.children}
</div>
);
}
}
class FormGroup extends React.Component {
render() {
return (
<div className = "form-group" >
<label htmlFor = {this.props.labelFor} >
{this.props.label}
</label>
{this.props.children}
</div>
);
}
}
const ProductSelect = observer(class ProductSelect extends React.Component {
onChange = (e = null) => {
this.props.store.product.value = null !== e ? e.value : null;
this.props.store.findLocationAllocationData();
};
getOptions = (input, callback) => {
this.props.store.findProduct(input, callback);
};
render() {
const product = this.props.store.product;
return (
<Select.Async
id = "product"
name = "product"
className = "requiredField"
loadOptions = {this.getOptions}
onChange = {this.onChange}
value = { product.value}
/>
);
}
});
const MyForm = observer(class MyForm extends React.Component {
render() {
const store = this.props.store;
return (
<div>
<form >
<Well legend="Step 1 - Product">
<div className="row">
<div className="col-md-4">
<FormGroup label="Product" labelFor="product">
<ProductSelect store={store} />
</FormGroup>
</div>
</div>
</Well>
</form>
</div>
)
}
});
const myStore = new MyStore();
ReactDOM.render(
<MyForm store={myStore}/>, document.getElementById('root')
);
您的操作功能很好,但您必须注意:操作仅影响当前 运行 功能。您可能想要创建一个回调操作,例如 findLocationAllocationData-callback
和 findProduct-callback
MobX 不是一种架构,您可以按照自己的意愿构建代码,没有最佳实践。您可能希望将您的操作和 API 调用分开。
你可以看看this repo寻找灵感。
我对 React 和 MobX 还很陌生。我 read/watched 有很多关于反应和与 MobX 结合反应的教程。
我需要创建一个表单,用户可以在其中 select(自动完成)产品。我正在使用 react-select 来做到这一点。当用户 select 使用产品时,界面需要使用 select 产品的位置更新另一个 select(我还没有实现,但它将使用来自位置可观察)。
- 有没有关于如何在 React 元素和 MobX 之间建立通信的 'best practices'?
- 'findProduct'和'findLocationAllocationData '被定义为一个动作。这是正确的吗?
感谢您的帮助!
const {observable, action} = mobx;
const {observer} = mobxReact;
class MyStore {
product = observable({value: null});
locations= observable({value: null,options: [],disabled: true});
findProduct = action((input, callback) => {
//ajax call to get products
// JSON object as an example
callback(null, {
options: [{key: 1, value: 1, label: 'product a'},
{key: 2, value: 2, label: 'product b'}
],
complete: true
})
});
findLocationAllocationData = action(() => {
if (null === this.product.value) {
return;
}
//ajax-call to get the locations and to update the location observable options
}
}
反应内容:
class Well extends React.Component {
render() {
return (
<div className = "well" >
<span className = "well-legend" > {this.props.legend} < /span>
{this.props.children}
</div>
);
}
}
class FormGroup extends React.Component {
render() {
return (
<div className = "form-group" >
<label htmlFor = {this.props.labelFor} >
{this.props.label}
</label>
{this.props.children}
</div>
);
}
}
const ProductSelect = observer(class ProductSelect extends React.Component {
onChange = (e = null) => {
this.props.store.product.value = null !== e ? e.value : null;
this.props.store.findLocationAllocationData();
};
getOptions = (input, callback) => {
this.props.store.findProduct(input, callback);
};
render() {
const product = this.props.store.product;
return (
<Select.Async
id = "product"
name = "product"
className = "requiredField"
loadOptions = {this.getOptions}
onChange = {this.onChange}
value = { product.value}
/>
);
}
});
const MyForm = observer(class MyForm extends React.Component {
render() {
const store = this.props.store;
return (
<div>
<form >
<Well legend="Step 1 - Product">
<div className="row">
<div className="col-md-4">
<FormGroup label="Product" labelFor="product">
<ProductSelect store={store} />
</FormGroup>
</div>
</div>
</Well>
</form>
</div>
)
}
});
const myStore = new MyStore();
ReactDOM.render(
<MyForm store={myStore}/>, document.getElementById('root')
);
您的操作功能很好,但您必须注意:操作仅影响当前 运行 功能。您可能想要创建一个回调操作,例如 findLocationAllocationData-callback
和 findProduct-callback
MobX 不是一种架构,您可以按照自己的意愿构建代码,没有最佳实践。您可能希望将您的操作和 API 调用分开。
你可以看看this repo寻找灵感。