如何更改制作动态饼图的状态? [英] How to change states for making dynamic pie chart?

查看:78
本文介绍了如何更改制作动态饼图的状态?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试制作一个动态饼图,它会随着滑块的变化而变化。
我已经设置了一切但我不能在其中引入状态,因为我是新手做出反应。我只是希望当有人滑动滑块时,饼图也会根据滑块的值而变化。任何人都可以帮助我吗?

I am trying to make a dynamic pie chart, which changes on change of slider. I have setup everything But i'am not able to introduce states in it as I am new to react. I just want that when someone slides slider, the pie chart also changes according to value of slider. Can anyone help me?

<!DOCTYPE html>
<html>
	<head>
		<title>React Example without Babel </title>
		<script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
		<script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.0-alpha1/JSXTransformer.js"></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react-with-addons.js"></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js"></script>
		<link href="http://getbootstrap.com/dist/css/bootstrap.css" rel="stylesheet">
		<style>
			.pie{
				fill:red;
			}
		</style>
	</head>
	<body>
		<div class="container">
			<div id="app"></div>
			<div class="col-lg-5" id="slider"></div>
			<div class="col-lg-6" id="pie_chart"></div>
		</div>
		<script type="text/jsx">
			
			class Header extends React.Component{
				render(){
					return (<div><h1 className='page-header'>{this.props.text}</h1></div>);
				}
			}
			ReactDOM.render(<Header text='Dynamic Pie Chart'/>,document.getElementById('app'));
			class Slider extends React.Component{
				render(){
					return (<div><input type='range' min='1' max='100' /></div>);
				}
			}
			ReactDOM.render(<Slider />,document.getElementById('slider'));
			var PropTypes = React.PropTypes;
			var PieChart = React.createClass({
			displayName: 'PieChart',
			propTypes: {
				className: PropTypes.string,
				size: PropTypes.number,
				slices: PropTypes.arrayOf(PropTypes.shape({
				color: PropTypes.string.isRequired, // hex color
				value: PropTypes.number.isRequired })).isRequired },
				getDefaultProps: function getDefaultProps() {
					return {
						size: 200 };
					},
				
  _renderPaths: function _renderPaths() {
    var radCircumference = Math.PI * 2;
    var center = this.props.size / 2;
    var radius = center - 1; // padding to prevent clipping
    var total = this.props.slices.reduce(function (totalValue, slice) {
      return totalValue + slice.value;
    }, 0);

    var radSegment = 0;
    var lastX = radius;
    var lastY = 0;

    return this.props.slices.map(function (slice, index) {
      var color = slice.color;
      var value = slice.value;

      // Should we just draw a circle?
      if (value === total) {
        return React.createElement('circle', {
          r: radius,
          cx: radius,
          cy: radius,
          fill: color,
          key: index
        });
      }

      if (value === 0) {
        return;
      }

      var valuePercentage = value / total;

      // Should the arc go the long way round?
      var longArc = valuePercentage <= 0.5 ? 0 : 1;

      radSegment += valuePercentage * radCircumference;
      var nextX = Math.cos(radSegment) * radius;
      var nextY = Math.sin(radSegment) * radius;

      // d is a string that describes the path of the slice.
      // The weirdly placed minus signs [eg, (-(lastY))] are due to the fact
      // that our calculations are for a graph with positive Y values going up,
      // but on the screen positive Y values go down.
      var d = ['M ' + center + ',' + center, 'l ' + lastX + ',' + -lastY, 'a' + radius + ',' + radius, '0', '' + longArc + ',0', '' + (nextX - lastX) + ',' + -(nextY - lastY), 'z'].join(' ');

      lastX = nextX;
      lastY = nextY;

      return React.createElement('path', { d: d, fill: color, key: index });
    });
  },

  /**
   * @return {Object}
   */
  render: function render() {
    var size = this.props.size;

    var center = size / 2;

    return React.createElement(
      'svg',
      { viewBox: '0 0 ' + size + ' ' + size },
      React.createElement(
        'g',
        { transform: 'rotate(-90 ' + center + ' ' + center + ')' },
        this._renderPaths()
      )
    );
  }
});

var slices = [
    { color: '#468966', value: 180 },
    { color: '#FFF0A5', value: 180 },
   
];

ReactDOM.render(<PieChart slices={slices} />, document.getElementById('pie_chart'));
		
			
		</script>
	</body>
</html>

推荐答案

嗨请检查它现在正在运行的代码。您必须将幻灯片更改值传递给州。我改变了一些代码。请检查。

Hi Please check the code its working now. You have to pass your slide change value to the state. I have changed few code. Please check.

    <!DOCTYPE html>
<html>
    <head>
        <title>React Example without Babel </title>
        <script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
        <script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.0-alpha1/JSXTransformer.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react-with-addons.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js"></script>
        <link href="http://getbootstrap.com/dist/css/bootstrap.css" rel="stylesheet">
        <style>
            .pie{
                fill:red;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <div id="app"></div>
            <div class="col-lg-5" id="slider"></div>
            <div class="col-lg-6" id="pie_chart"></div>
        </div>
        <script type="text/jsx">

            class Header extends React.Component{
                render(){
                    return (<div><h1 className='page-header'>{this.props.text}</h1></div>);
                }
            }
            ReactDOM.render(<Header text='Dynamic Pie Chart'/>,document.getElementById('app'));
            class Slider extends React.Component{
                render(){
                    return (<div><input type='range' min='1' max='100' onChange = {this.props.sliderEvent} /></div>);
                }
            }

            var PropTypes = React.PropTypes;
            var PieChart = React.createClass({
            displayName: 'PieChart',
            propTypes: {
                className: PropTypes.string,
                size: PropTypes.number,
                slices: PropTypes.arrayOf(PropTypes.shape({
                color: PropTypes.string.isRequired, // hex color
                value: PropTypes.number.isRequired })).isRequired },
                getDefaultProps: function getDefaultProps() {
                    return {
                        size: 200 };
                    },

  _renderPaths: function _renderPaths() {
    var radCircumference = Math.PI * 2;
    var center = this.props.size / 2;
    var radius = center - 1; // padding to prevent clipping
    var total = this.props.slices.reduce(function (totalValue, slice) {
      return totalValue + slice.value;
    }, 0);

    var radSegment = 0;
    var lastX = radius;
    var lastY = 0;

    return this.props.slices.map(function (slice, index) {
      var color = slice.color;
      var value = slice.value;

      // Should we just draw a circle?
      if (value === total) {
        return React.createElement('circle', {
          r: radius,
          cx: radius,
          cy: radius,
          fill: color,
          key: index
        });
      }

      if (value === 0) {
        return;
      }

      var valuePercentage = value / total;

      // Should the arc go the long way round?
      var longArc = valuePercentage <= 0.5 ? 0 : 1;

      radSegment += valuePercentage * radCircumference;
      var nextX = Math.cos(radSegment) * radius;
      var nextY = Math.sin(radSegment) * radius;

      // d is a string that describes the path of the slice.
      // The weirdly placed minus signs [eg, (-(lastY))] are due to the fact
      // that our calculations are for a graph with positive Y values going up,
      // but on the screen positive Y values go down.
      var d = ['M ' + center + ',' + center, 'l ' + lastX + ',' + -lastY, 'a' + radius + ',' + radius, '0', '' + longArc + ',0', '' + (nextX - lastX) + ',' + -(nextY - lastY), 'z'].join(' ');

      lastX = nextX;
      lastY = nextY;

      return React.createElement('path', { d: d, fill: color, key: index });
    });
  },

  /**
   * @return {Object}
   */
  render: function render() {
    var size = this.props.size;

    var center = size / 2;

    return React.createElement(
      'svg',
      { viewBox: '0 0 ' + size + ' ' + size },
      React.createElement(
        'g',
        { transform: 'rotate(-90 ' + center + ' ' + center + ')' },
        this._renderPaths()
      )
    );
  }
});


class App extends React.Component{
    constructor(props){
  super(props);
  this.state = {
    slices : [
      { color: '#468966', value: 180 },
      { color: '#FFF0A5', value: 180 },
     ]
    };  
  //this.handleSliderEvent = this.bind.handleSliderEvent(this);
  }
  handleSliderEvent(e){
        var slices1 = (360 * e.target.value)/100;
      var slices2 = 360 - slices1;
      var array1 = [
        { color: '#468966', value: slices1 },
        { color: '#FFF0A5', value: slices2 }
        ];
        console.log(array1)
      this.setState({slices: array1});

  }
    render(){
    return(
        <div>
      <Slider sliderEvent = {this.handleSliderEvent.bind(this)}/>
      <PieChart slices = {this.state.slices} />
      </div>
    )
  }
}
ReactDOM.render(<App/>, document.getElementById('pie_chart'));


        </script>
    </body>
</html>

通过这个小提琴,它有你的代码的工作版本。

Go through the this fiddle as well which has working version of your code.

https://jsfiddle.net/oyqzms4c/

这篇关于如何更改制作动态饼图的状态?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆