Как собрать данные через реквизит и сделать круговую диаграмму React.js и D3 без Redux

Я делаю круговую диаграмму, используя React и D3. Круговая диаграмма должна динамически обновлять изменение элемента. Есть три категории предметов. Я борюсь за то, чтобы передать данные основному компоненту.

У меня есть два других компонента, которые составляют список предметов. Каждый список может удалять, добавлять, редактировать и сохранять. Таким образом, изменение длины списка должно динамически обновляться в круговой диаграмме.

Вот основной компонент списка. У меня есть два других компонента списка для создания списков. Я хочу пройти props.itemSecond.length из второго компонента списка в основной компонент списка.

Я пытался несколько раз к этому, но я не смог этого добиться. Я слышал, что лучше использовать Redux, но разве невозможно реализовать эту функцию без Redux?

Компонент списка

export default class List extends React.Component {
constructor(props){
    super(props);
    this.state={
        questionItem,
        pieData : [{label: "question1", value: 4}, {label: "question2", value: 5}, {label: "question3", value: 3 }]
}
}

createItem(item){
    this.state.questionItem.unshift({
        item : item,
    });

    let length1 = questionItem.length;

    var array = [
    {label : "question1" ,value : length1 },
    {label: "question2", value: 5}, 
    {label: "question3", value: 3} ]

    this.setState({
        questionItem : this.state.questionItem,
        pieData : array
    });
}

findItem(item) {
    return this.state.questionItem.filter((element) => element.item === item)[0];
}

toggleComplete(item){
    let selectedItem = this.findItem(item);
    selectedItem.completed = !selectedItem.completed;
    this.setState({ questionItem : this.state.questionItem });
}

saveItem(oldItem, newItem) {
    let selectedItem = this.findItem(oldItem);
    selectedItem.item = newItem;

    let length1 = questionItem.length;

    var array = [
    {label : "question1" ,value : length1 },
    {label: "question2", value: 5}, 
    {label: "question3", value: 3} ]
     this.setState({ questionItem : this.state.questionItem,
                     pieData : array });
 }

deleteItem(item) {
    let index = this.state.questionItem.map(element => element.item).indexOf(item);
    this.state.questionItem.splice(index, 1);

    let length1 = questionItem.length;

    var array = [
    {label : "question1" ,value : length1 },
    {label: "question2", value: 5}, 
    {label: "question3", value: 3} ]

    this.setState({ questionItem : this.state.questionItem,
                      pieData : array
                 });
}

componentDidMount() {
  const newitemSecond = this.props.itemSecond;
  console.log(newitemSecond)
}

render() {
    const { questionItem } = this.state;
     const { length } = this.props
    return (
    <div>
    <DataChart data = { this.state.pieData} /> 
    <div className="list" style={{"display" : "flex"}}>
    <div className="titleElement" style={{"flex": "1", "backgroundColor" : "orange"}}>Advice + FAQ </div>
    <div style={{"flex": "5", "display": "flex", "flex-direction": "column"}}>
    <QuestionList questionItem={this.state.questionItem} deleteItem={this.deleteItem.bind(this)}  saveItem={this.saveItem.bind(this)} toggleComplete={this.toggleComplete.bind(this)} />
    <CreateItem questionItem={this.state.questionItem} createItem={this.createItem.bind(this)} />
    </div>
     </div>
     <ListSecond />
     <ListThird />
     </div>);
}
}

length 1 получает обновленную длину элемента. Я хочу передать данные из других компонентов так же, как длина 1.

Компонент круговой диаграммы

class DataChart extends React.Component {
    render(){
    var PieChart = rd3.PieChart
     var array = [
        {label : "question1" ,value : 4},
        {label: "question2", value: 5}, 
        {label: "question3", value: 3} ]
    return  (
     <PieChart
      data={this.props.data}
      width={450}
      height={400} 
      radius={110}
      innerRadius={20}
      sectorBorderColor="white"
      title="Pie Chart" />
    )}
    }


  class Chart extends React.Component {
  render() {
    const { length } = this.props
    return (
      <div>Chart: {length}</div>
    )
  }
}

0 ответов

Другие вопросы по тегам