react组件的多个实例不工作
multiple instances of react components not working?
我试图创建我的react组件的多个实例,但只有第一个被呈现。我想我在这里做了一些重大失败:)
这是组件。
import React from 'react';
import ReactDOM from 'react-dom';
import ChartJS from 'chart.js'
import DataService from '../core/data-service.js';
function GetReportData() {
let chartElement = document.getElementById('react-chart-bar');
var id = {
id: chartElement.dataset.id
};
DataService.getReportData(id).done(function(data) {
renderChart(data);
}).fail(function(jqXHR, status, error) {
console.log(error);
});
}
function renderChart(data) {
var ctx = document.getElementById('chart-bar');
var chart_bar = new ChartJS(ctx, {
type: data.ChartType,
data: {
labels: data.Labels,
datasets: data.DataSet
},
options: {
responsive: true,
scales: {
yAxes: [
{
ticks: {
beginAtZero: true,
max: data.MaxTicks
}
}
]
}
}
});
}
class Chart extends React.Component {
componentDidMount() {
GetReportData();
}
render() {
return <div>
<canvas id="chart-bar" width="400" height="300"></canvas>
</div>
}
}
let node = document.getElementById('react-chart-bar');
if (node != null) {
ReactDOM.render(
<Chart/>, node);
}
然后在我的HTML中,我这样调用组件。
<div id="react-chart-bar" data-id="1"></div>
<div id="react-chart-bar" data-id="9"></div>
我需要呈现相同的组件,但基于HTML元素上的data-id属性使用不同的数据。
谢谢你的帮助:)
//G
与其像在其他框架中那样使用id
属性,不如在React组件中使用ReactDOM.findDOMNode
来获得对真正DOM节点的引用。只有当组件被渲染时才这样做,就像在componentDidMount
中:
import React from 'react';
import ReactDOM from 'react-dom';
import ChartJS from 'chart.js'
import DataService from '../core/data-service.js';
class Chart extends React.Component {
componentDidMount() {
let chartElement = ReactDOM.findDOMNode(this);
var id = {
id: this.props.reportId,
};
DataService.getReportData(id).done((data) => {
this.renderChart(data);
}).fail(function(jqXHR, status, error) {
console.log(error);
});
}
renderChart(data) {
var ctx = ReactDOM.findDOMNode(this);
var chart_bar = new ChartJS(ctx, {
type: data.ChartType,
data: {
labels: data.Labels,
datasets: data.DataSet
},
options: {
responsive: true,
scales: {
yAxes: [
{
ticks: {
beginAtZero: true,
max: data.MaxTicks
}
}
]
}
}
});
}
render() {
return <div>
<canvas width="400" height="300"></canvas>
</div>
}
}
let node = document.getElementById('react-chart-bar');
if (node != null) {
ReactDOM.render(
<Chart reportId={node.getAttribute('data-id')} />,
node
);
}
我建议使用包装器组件,并为每个id呈现如下图所示的图表。
function getReportData(id) {
return `Here is some data for id ${id}`;
}
class Chart extends React.Component {
constructor () {
super();
this.state = {
data: null
};
}
componentDidMount() {
this.setState({ data: getReportData(this.props.dataId) });
}
render() {
return (
<div>
<span>{this.state.data}</span>
<canvas id="chart-bar" width="400" height="10"></canvas>
</div>
);
}
}
class App extends React.Component {
render() {
return (
<div>
<Chart dataId='1' />
<Chart dataId='2' />
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id='root'></div>
相关文章:
- Javascript:只有在代码中使用单个实例时,函数才能正常工作
- 了解 JavaScript 对象实例或工作流
- JavaScript网站与工作实例
- 主干视图实例未按预期工作
- ZeroClipboard剪辑的多个实例不工作
- CKEDITOR 拖放插件集成在编辑器实例销毁并重新创建后停止工作
- 角度自定义指令基本输入过滤器工作不正常,只显示匹配的第一个实例
- 为什么不't在babel节点下的Error子类实例上的工作实例
- Widget的两个实例只有一个实例在工作
- 启动日期时间选择器3多实例格式不工作
- CKEDITOR EqnEditor(数学插件)不工作在同一页面上的多个实例
- CKEDITOR get实例不工作
- moment.js的isoWeek不能在Heroku实例上工作
- react组件的多个实例不工作
- Google Apps脚本,用于发现Google工作表的两列之间的差异,忽略空白单元格和多个实例
- 从当前脚本(即thisscript.js?id=1&type=2)的url获取参数,不能与多个实例一起工作
- Javascript绑定与其实例一起工作
- ImmutableJS不能与新的自定义对象实例一起工作
- AngularJS和cordova: web应用工作,但不能cordova:实例化模块失败
- Javascript日历新实例工作不一致