@andrey_koyta

Можно ли менять state внешнего компонента через props?

Недавно столкнулся с проблемой - менять state через изменения во внутреннем компоненте. Я знаю, что можно передавать внутрь компонента внешнюю функцию, которая будет изменять через this.setState({ something: входной параметр });

Допустим:
// InnerComponent
// Тут код компонента
// Внутри компонента, допустим, на input'e, меняем this.props.text через onChange

Почему реакт позволяет менять, без ошибок, state внешнего компонента простым изменением props? Ведь менять можно лишь через this.setState?
// State of App component
this.state = {
    text: 'Hello world'
}

render() {
  return <InnerComponent text={this.state.text} />
}


Конкретная ситуация тут. (github)
  • Вопрос задан
  • 1136 просмотров
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
1. Если попытаетесь изменить this.props, получите исключение:
Cannot assign to read only property
2. У вас есть возможность мутировать state, вот только делать это не нужно.

Хороший способ управления состоянием компонентов через родителя:
class Example extends Component {
  state = {
    inputValue: '',
  };

  handleChange = e => { 
    const { name, value } = e.target;
    
    this.setState({
      [name]: value,
    });
  };

  render() {
    const { inputValue } = this.state;

    return (
      <Wrapper>
        <input
          name="inputValue"
          value={inputValue}
          onChange={this.handleChange}
        />
        ...
      </Wrapper>
    );
  }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
aM-aM
@aM-aM
Люблю js
чисто пример, можно сделать красивее.
this.state = {
    text: 'Hello world'
}

handleChangeText = text => {
   this.setState({ text })
}

render() {
  return <InnerComponent handleChangeText={this.handleChangeText} text={this.state.text} />
}

const InnerComponent = ({ handleChangeText }) => {
  return (
    <div onClick={() => handleChangeText('some text')}>text</div>
  );
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы