Javascript 将新服务器数据传递给react.js组件
我是React.js的新手,正在努力理解一些核心概念,以决定是否将此库用于我们的应用程序。我的主要问题实际上是在从服务器获取的模型中处理更新 想象一下,我有一个页面应该显示五种不同的模型。我已经按照本文所描述的方式构建了它,所以我有了“根”组件,所有5个模型都在其中传递,并且使用道具,它们将向下传递到包含这些模型的组件。所以,现在更新了两个模型(我从react组件之外的模型代码中获取这些事件),我需要在UI上反映这些。最好的方法是什么 我正在考虑以下选择:Javascript 将新服务器数据传递给react.js组件,javascript,reactjs,Javascript,Reactjs,我是React.js的新手,正在努力理解一些核心概念,以决定是否将此库用于我们的应用程序。我的主要问题实际上是在从服务器获取的模型中处理更新 想象一下,我有一个页面应该显示五种不同的模型。我已经按照本文所描述的方式构建了它,所以我有了“根”组件,所有5个模型都在其中传递,并且使用道具,它们将向下传递到包含这些模型的组件。所以,现在更新了两个模型(我从react组件之外的模型代码中获取这些事件),我需要在UI上反映这些。最好的方法是什么 我正在考虑以下选择: 再次使用新数据运行renderComp
提前谢谢你,希望我能清楚地解释我的问题 使用相同的组件但不同的数据再次调用renderComponent相当于调用component.setProps()。因此,要么以最小公分母将所有模型保持为状态,要么在更改时再次调用setProps/renderComponent。如果您将数据作为道具传递给子组件,您只需在更高级别上更新它,它将强制对使用相同属性对象的所有组件进行渲染。考虑这个简单的例子:
var World = React.createClass({
render: function() {
return <strong>{this.props.name}</strong>;
}
});
var Hello = React.createClass({
clickHandler: function() {
this.setProps({ name: 'earth' });
},
render: function() {
return (
<div>
Hello <World name={this.props.name} />
<button onClick={this.clickHandler}>Click me</button>
</div>
);
}
});
这是因为react使用单向属性绑定。但是,如果说您的子组件将更新其属性,它将不会上升到其父组件。为此,您将需要或使用类似主干网提供的发布/订阅接口。目前,我至少知道三种将新数据传递到组件的方法:
var Data={value:1};
var dataChange=函数(回调){
如果(回调){
回调(数据);
setInterval(函数(){
Data.value++;
回调(数据);
}, 1000);
}
返回数据;
};
var World=React.createClass({
render:function(){
返回{this.props.data.value};
}
});
var Hello=React.createClass({
getInitialState:函数(){
返回{
数据:this.props.dataChange()
};
},
componentDidMount:function(){
this.props.dataChange(this.updateHandler)
},
updateHandler:函数(数据){
这是我的国家({
数据:数据
});
},
render:function(){
返回(
价值:
);
}
});
React.renderComponent(,document.body);
还有一个扩展版本在
函数ListenersService(){
var侦听器={};
this.addListener=函数(回调){
变量id;
if(回调类型==='function'){
id=Math.random().toString(36).slice(2);
侦听器[id]=回调;
}
返回id;
}
this.removeListener=函数(id){
if(侦听器[id]){
删除侦听器[id];
返回true;
}
返回false;
}
this.notifyListeners=函数(数据){
for(侦听器中的变量id){
if(listeners.hasOwnProperty(id)){
侦听器[id](数据);
}
}
}
}
函数数据服务(ListenerService){
变量数据={value:1};
var self=这个;
var listenersService=new listenersService();
this.addListener=listenersService.addListener;
this.removeListener=listenersService.removeListener;
this.getData=函数(){
返回数据;
}
setInterval(函数(){
Data.value++;
ListenerService.notifyListeners(数据);
}, 1000);
}
var dataSevice=新的数据服务(ListenerService);
var World=React.createClass({
render:function(){
返回{this.props.data.value};
}
});
var Hello=React.createClass({
getInitialState:函数(){
返回{
数据:this.props.dataService.getData()
};
},
componentDidMount:function(){
this.props.dataService.addListener(this.updateHandler)
},
updateHandler:函数(数据){
这是我的国家({
数据:数据
});
},
render:function(){
返回(
价值:
);
}
});
React.renderComponent(,document.body);
此实现并不完全遵循独立组件的思想(因为Hello组件依赖于DataServiceAPI),但它可以进一步抽象,并取决于应用程序开发人员其组件将遵循哪些特定于应用程序的约定。例如
// simple example of a data model
var Data = { name: 'world' };
var World = React.createClass({
render: function() {
return <strong>{this.props.data.name}</strong>;
}
});
var Hello = React.createClass({
clickHandler: function() {
this.setProps({
data: { name: 'earth' }
});
},
render: function() {
return (
<div>
Hello <World data={this.props.data} />
<button onClick={this.clickHandler}>Click me</button>
</div>
);
}
});
React.renderComponent(<Hello data={Data} />, document.body);
var Data = { value: 1 };
var dataChange = function(callback){
if(callback){
callback(Data);
setInterval(function(){
Data.value++;
callback(Data);
}, 1000);
}
return Data;
};
var World = React.createClass({
render: function() {
return <strong>{this.props.data.value}</strong>;
}
});
var Hello = React.createClass({
getInitialState: function() {
return {
data: this.props.dataChange()
};
},
componentDidMount: function() {
this.props.dataChange(this.updateHandler)
},
updateHandler: function(data) {
this.setState({
data: data
});
},
render: function() {
return (
<div>
Value: <World data={this.state.data} />
</div>
);
}
});
React.renderComponent(<Hello dataChange={dataChange} />, document.body);
function ListenersService(){
var listeners = {};
this.addListener = function(callback){
var id;
if(typeof callback === 'function'){
id = Math.random().toString(36).slice(2);
listeners[id] = callback;
}
return id;
}
this.removeListener = function( id){
if(listeners[id]){
delete listeners[id];
return true;
}
return false;
}
this.notifyListeners = function(data){
for (var id in listeners) {
if(listeners.hasOwnProperty(id)){
listeners[id](data);
}
}
}
}
function DataService(ListenersService){
var Data = { value: 1 };
var self = this;
var listenersService = new ListenersService();
this.addListener = listenersService.addListener;
this.removeListener = listenersService.removeListener;
this.getData = function(){
return Data;
}
setInterval(function(){
Data.value++;
listenersService.notifyListeners(Data);
}, 1000);
}
var dataSevice = new DataService(ListenersService);
var World = React.createClass({
render: function() {
return <strong>{this.props.data.value}</strong>;
}
});
var Hello = React.createClass({
getInitialState: function() {
return {
data: this.props.dataService.getData()
};
},
componentDidMount: function() {
this.props.dataService.addListener(this.updateHandler)
},
updateHandler: function(data) {
this.setState({
data: data
});
},
render: function() {
return (
<div>
Value: <World data={this.state.data} />
</div>
);
}
});
React.renderComponent(<Hello dataService={dataSevice} />, document.body);
<div id="static"></div>
<div id="dynamic"></div>
<script>
function ListenersService(){
var listeners = {};
this.addListener = function(callback){
var id;
if(typeof callback === 'function'){
id = Math.random().toString(36).slice(2);
listeners[id] = callback;
}
return id;
}
this.removeListener = function( id){
if(listeners[id]){
delete listeners[id];
return true;
}
return false;
}
this.notifyListeners = function(data){
for (var id in listeners) {
if(listeners.hasOwnProperty(id)){
listeners[id](data);
}
}
}
}
function DataService(ListenersService){
var Data = { value: 1 };
var self = this;
var listenersService = new ListenersService();
this.addListener = listenersService.addListener;
this.removeListener = listenersService.removeListener;
this.getData = function(){
return Data;
}
setInterval(function(){
Data.value++;
listenersService.notifyListeners(Data);
}, 100);
}
var dataSevice = new DataService(ListenersService);
var halloDataDynamic = function(callback){
var data = dataSevice.getData();
if(callback){
dataSevice.addListener(function(data){
callback(data);
});
}
return data;
};
var halloDataStatic = dataSevice.getData();
var World = React.createClass({
render: function() {
return <strong>{this.props.data.value}</strong>;
}
});
var Hello = React.createClass({
getInitialState: function() {
var data;
if(typeof this.props.halloData === 'function'){
data = this.props.halloData(this.updateHandler)
}
else data = this.props.halloData;
return {
data: data
};
},
updateHandler: function(data) {
this.setState({
data: data
});
},
render: function() {
return (
<div>
Value {this.props.name}: <World data={this.state.data} />
</div>
);
}
});
</script>
React.renderComponent(<Hello halloData={halloDataStatic} name="static"/>, document.getElementById('static'));
React.renderComponent(<Hello halloData={halloDataDynamic} name="dynamic"/>, document.getElementById('dynamic'));