React + Flux——将输入绑定到单个“模型”的嵌套组件
React + Flux - Binding nested components with inputs to a single "model"
从Angular的角度来看,理解作用域以及指令/控制器如何与HTML交互,与我试图做的这个简单的例子相比,似乎是相当合乎逻辑的。
基本上,我有几个组件。
/** @jsx React.DOM */
var React = require('react');
var {TextInput} = require("./controls/TextInput.jsx");
var Group = React.createClass({
render: function () {
console.log(this.props.formdata); // passed from parent
return (
<fieldset className="">
<legend>My Field Group</legend>
{this.props.field.fields.map(function(fld, i) {
return (<div className="my-field">
<TextInput formdata={formdata} field={fld} />
</div>);
})}
</fieldset>
);
}
});
exports.Group = Group;
我的TextInput
是这样的:
** @jsx React.DOM */
var React = require('react');
var TextInput = React.createClass({
render: function () {
return (
<div className="form-group">
<label htmlFor={this._reactInternalInstance._rootNodeID+'_input'}>{this.props.field.label}</label>
<input type="" className="form-control" id={this._reactInternalInstance._rootNodeID+'_input'} value={???} placeholder=""/>
</div>
);
}
});
exports.TextInput = TextInput;
首先,我很确定我用_rootNodeId做什么可以更好,但还没有找到任何更好的例子。
我的主要问题是找出如何将文本框的值绑定到我的模型。
我也在"使用"Flux,并且有一个
var SomeStore = require('../stores/some-store');
和
var SomeActions = require('../actions/some-action');
对象,我可以用它来管理数据和调度事件。从本质上讲,我需要做的是,当一个子文本输入中的值发生变化时,我想处理这个变化,可能会改变模型中的其他一些值,并告诉受影响的控件/dom元素更新自己。
欢迎指教。
谢谢山姆
我假设您希望在不提交实际提交输入的情况下执行此操作。在React/Flux中,商店是最接近"模型"的东西。你需要构建你的Flux架构,这样你的React组件就能监听到存储的变化。例如,在您的TextInput组件中,我假设您不想实际提交数据(只需在输入信息后立即更新信息):
** @jsx React.DOM */
var React = require('react');
var SomeActions = require('../actions/some-action');
var TextInput = React.createClass({
handleChange: function () {
var generatedRef = this._reactInternalInstance._rootNodeID+'_input';
var data = React.findDOMNode(this.refs[generatedRef]).value;
SomeActions.UpdateStore(data);
},
render: function () {
var generatedRef = this._reactInternalInstance._rootNodeID+'_input';
return (
<div className="form-group">
<label htmlFor={this._reactInternalInstance._rootNodeID+'_input'}>{this.props.field.label}</label>
<input type="text" ref={generatedRef} onChange={this.handleChange} className="form-control" id={this._reactInternalInstance._rootNodeID+'_input'} placeholder=""/>
</div>
);
}
});
exports.TextInput = TextInput;
声明generatedRef
不是必要的,但我这样做是为了清楚。在SomeActions
中,您需要通过调度器调度有效载荷。SomeStore
需要侦听这种类型的有效负载并相应地更新其数据,然后发出其他组件正在侦听的更改。例如:
/** @jsx React.DOM */
var React = require('react');
var {TextInput} = require("./controls/TextInput.jsx");
var SomeStore = require('../stores/some-store');
var getData = function () {
return SomeStore.retrieveData(); //should return an object
};
var Group = React.createClass({
onChange: {
this.setState(getData());
},
componentDidMount: {
SomeStore.addChangeListener(this.onChange);
},
componentWillUnmount: {
SomeStore.removeChangeListener(this.onChange);
},
render: function () {
console.log(this.props.formdata); // passed from parent
return (
<fieldset className="">
<legend>My Field Group</legend>
{this.props.field.fields.map(function(fld, i) {
return (
<div className="my-field">
<TextInput formdata={formdata} field={fld} />
</div>);
})}
</fieldset>
);
}
});
exports.Group = Group;
这是我能做的最好的不知道你的动作和存储看起来像什么。基本上,只要您更改输入字段中的数据,handleChange就会调度一个操作。此操作将更新存储。store应该在更新时发出一个change
事件。然后,侦听这些更改的任何组件都将相应地更新,以反映商店的当前数据。
相关文章:
- Angularjs无法将单选按钮与嵌套范围内的模型绑定
- ExtJS 4:编写带有模型关联的嵌套XML
- 将js对象更改为使用嵌套的可观察数组敲除js视图模型
- 将嵌套的主干模型存储并恢复到本地存储中
- 聚合Sails.JS/Waterline中的嵌套模型数据
- BackboneJS-监听嵌套的模型更改
- 挖空.js嵌套视图模型不起作用
- 在AngularJS 1.5.x中嵌套列表并更正ng模型和ng值
- JavaScript具有从响应生成的角度嵌套对象模型(无限深)
- 使用嵌套ng中带有单选按钮的ng模型重复不起作用
- 嵌套主干模型未提取数据
- 嵌套的XML数据和ExtJS模型关联
- 使用数组中的嵌套对象在AngularJS中切换用于动态选择菜单的数据模型
- Sails.js - 如何更新嵌套模型
- 导轨嵌套模型形式:加载时而不是点击时
- 主干.js嵌套模型
- 如何检查主干模型中的嵌套属性是否已更改
- 如何将嵌套的JSON / C#数组加载到视图模型中?使用Knockout,jQuery
- 在 ember 上复制嵌套模型.js(成功保存后)
- 创建骨干模型嵌套函数