Создание массива в чаилд компоненте

137
13 июня 2019, 06:20

Мне в child компоненте по методу onClick надо модифицировать массив, который будет передаваться в родитель, а из родителя уже в другой child компонент.

Answer 1

Правильно, с точки зрения реакта это сделать следующим образом: массив хранить как состояние в родительском объекте, в родительском же объекте сделать функцию, которая модифицирует состояние, первому чайлду в качестве параметра передавать функцию, а второму значение массива.

Codepen

<div id="root">You have no JS enabled</div>
class FirstChild extends React.Component{
  render(){
    var {needArr} = this.props;
    var outList = needArr.map( (comp,key) => {
      return <li key={key}> {comp} </li>
    });
    return (<ul> {outList} </ul>)
  }
}
class SecondChild extends React.Component {
  render (){
    return [(<button onClick={() => {this.props.actions.buttonClick("aaa")}}>add me</button>),
            (<button onClick={() => this.props.actions.actionDva()}>RemoveFirst</button>),
           (<button onClick={() => this.props.actions.actionTri()}>RemoveLast</button>),
           (<button onClick={() => this.props.actions.actionFour("bbb")}>AddFirst</button>)
           ];
        };
}

class MainComp extends React.Component{
  constructor(props){
    super(props);
    this.state = {
      myArr:["A", "B", "C", "D"]
    }
  }
  modifyArray = (newComp) => {
    var {myArr} = this.state;
    myArr.push(newComp);
    this.setState({myArr});
  }
  removeFirst = () => {
    var {myArr} = this.state;
    myArr.shift();
    this.setState({myArr});
  }
  removeLast = () => {
    var {myArr} = this.state;
    myArr.pop();
    this.setState({myArr});
  }
  addFirst = (val) => {
    var {myArr} = this.state;
    myArr.unshift(val);
    this.setState({myArr});
  }
  render(){
    var {myArr} = this.state;
    return (<div>
        <FirstChild needArr={myArr}/>
        <SecondChild actions={{
            buttonClick:this.modifyArray,
            actionDva:this.removeFirst,
            actionTri:this.removeLast,
            actionFour:this.addFirst
          }}/>
        </div>)
  }
}

ReactDOM.render(
          <MainComp/>,
          document.getElementById('root')
        );
READ ALSO
помогите разобраться с выводом nodejs express

помогите разобраться с выводом nodejs express

Появилась новая проблемаСброшу только код сервера и всех

123
WebExtensions до chrome.runtime.onMessage.addListener не доходят сообщения

WebExtensions до chrome.runtime.onMessage.addListener не доходят сообщения

Пытаюсь заставить общаться свой testScriptjs с background

105
Пустой клик js как пофиксить?

Пустой клик js как пофиксить?

первый клик - пушу элемент в массив(там открываю его), второй клик - пушу второй элемент в массив (открываю его), третий клик - очищает массив,...

134
cypress error 401

cypress error 401

Хочу делать прогоны тестов на проекте в cypressПроект лежит на локальном сервере

142