如何在Reactjs中创建组件实例
How to make component instances in Reactjs
当我在init()
中调用ReactDom.render
时,仅创建一个g
标记,并且所有圆都在该g
标记内创建。但我希望在每个ReactDom.render
调用上都必须创建一个单独的g
标记。我对React中组件的了解是,我们可以使用React.createClass
实例化任意数量的组件。我该怎么做?
var Rect = React.createClass({
render: function() {
return (
React.createElement('circle', {
cx: this.props.cx,
cy: this.props.cy,
r: this.props.r,
fill: '#00ff00'
});
);
}
});
var globalArray = [];
var someFunc = function(cx, cy, r) {
var Factory = React.createClass({
render: function() {
var localArray = [];
for(var i = 0; i < 1; i++) {
localArray[i] = React.createElement(Rect, {
key: globalArray.length,
cx: cx,
cy: cy,
r: r
})
}
globalArray[globalArray.length] = localArray[0];
return (
React.createElement('g', {}, globalArray)
)
}
});
return Factory;
}
var randomNumber = function (x,y) {
return ~~(Math.floor(((Math.random()*x) + y )));
}
var obj = {
init: function() {
var element;
for(var i = 0; i < 100; i++) {
var cx = randomNumber(1200,40);
var cy = randomNumber(600,40);
var r = randomNumber(30,20);
element = someFunc(cx,cy,r);
ReactDOM.render(
React.createElement(element,{}),
document.getElementById('svg')
);
}
}
}
您可能会发现,让代码的结构由React组件定义,而不是由您自己的函数和全局变量定义,会让您受益匪浅。
一般来说,如果你发现自己多次呼叫ReactDOM.render
,那么可能出了问题。
顶级组件
与其将100个组件渲染为一个元素,不如定义一个由100个子组件实例组成的顶级组件,然后渲染一次。
var Graphics = React.createClass({
// ...
});
ReactDOM.render(
React.createElement(Graphics, null),
document.getElementById('svg')
);
我们将创建一个Graphics
组件,可以将其用作其余组件的父组件我们只需要渲染一次。
州
与其将圆列表存储在全局数组中,不如在新的顶级组件上使用state属性。这样,无论何时更新,组件都将重新渲染以反映更改。
getInitialState: function() {
// by default there are no circles (empty array)
return { circles: [] };
},
componentWillMount: function() {
var circles = [];
for(var i = 0; i < 100; i++) {
// rather than storing actual circles, we just store
// the props that are needed to create them
circles.push({
cx: randomNumber(1200, 40),
cy: randomNumber(600, 40),
r: randomNumber(30,20)
});
}
this.setState({ circles: circles });
}
getInitialState
允许我们为this.state
上的属性定义默认值,componentWillMount
允许在DOM中呈现组件之前运行代码。
渲染
既然Graphics组件已经了解了圆列表,我们就必须描述它的渲染方式。
render: function() {
var circles = this.state.circles.map(function(props) {
return React.createElement(Circle, props);
});
return React.createElement('g', null, circles);
}
此函数使用map
使用我们存储在this.state.circles
中的道具创建Circle
组件。
结论
React在您将组件构建为生活在一个顶级容器组件中时最有效,就像我们在这里创建的那样。与其做任何命令性操作(比如每次循环和渲染组件),不如寻找声明性的替代方案。
React希望您告诉它您想要什么,而不是应该如何。
在这种情况下,你想要的是一个内部有许多随机大小和位置的圆圈的组件,但你试图做的是向React解释应该如何实现这一点。
var Circle = React.createClass({
render: function() {
// ...
}
});
var Graphics = React.createClass({
getInitialState: function() {
// ...
},
componentWillMount: function() {
// ...
},
render: function() {
// ...
}
});
生成的代码不仅应该更短、更易于遵循,而且还应该易于重构。不需要做太多工作,就可以将配置细节(如圆圈的数量)移动为Graphics
的道具。
- 如何使用浏览器中用酶创建的组件反应例如摩卡
- 如何创建一个组件,我可以设置在 Angular 2 中的属性中获取 URL 数据
- 使用 XPCOM 和 JavaScript 为 Firefox 创建附加组件
- Reactjs基于jsx中的属性创建条件组件
- 在 React 中创建向导组件的最佳方法
- 如何在变化中创建通用组件
- 我想使用jquery创建独立组件,这是附加事件的正确方式
- 监听来自动态创建的组件的事件
- 在Angular 2中为动态创建的组件处理@Input和@Output
- 在创建React组件时,我应该使用功能组件吗?创建或扩展React.Component
- 向动态创建的组件添加事件绑定
- 创建一个组件并注入到index.html中
- 创建React组件的两种不同方式
- 加载在angular2final中动态创建的组件
- Angular 2 - 动态创建/注入组件到 *ngFor 循环中的特定元素中
- Angular JS创建新组件时选项卡的默认选项
- Angular 2 -注入由HTML选择器创建的组件
- React.createElement:类型不应为null或未定义.创建/渲染组件时
- 在 O365 中创建组
- 在 Vue.JS 中的父组件中创建子组件