Почему мне нужно написать cloneElement, тогда дочерний компонент будет перерисован

если я пишу только {this.props.children}, третья строка не может меняться каждую секунду. Мне нужно написать {React.cloneElement (this.props.children)}, почему?

Это родительский 下午 1:50:27. Это ребенок 下午 1:50:27. Это ребенок 下午 1:28:30.

https://codepen.io/yemos/pen/jQveVx/?editors=0011

class A extends React.Component {
  constructor(props) {
    super(props);
    this.state = { date: new Date() };
  }

  componentDidMount() {
    this.timerID = setInterval(() => this.setState({date: new Date()}), 1000);
  }

  componentWillUnmount() {
    clearInterval(this.timerID);
  }
  
  render() {
    return (
      <div>
        <h5>It is parent{this.state.date.toLocaleTimeString()}.</h5>
		{React.cloneElement(this.props.children)}
		{this.props.children}
      </div>
    );
  }
}

class B extends React.Component {
  componentWillMount(){
    console.info('componentWillMount');
  }
  render() {
    console.info('render');
    return <h5>It is child{new Date().toLocaleTimeString()}.</h5>;
  }
}
ReactDOM.render(<A><B/></A>, document.getElementById("root"));
<div id = "root">
    <!-- This element's contents will be replaced with your component. -->
</div>

)

stackoverflow.com/a/37522586/2630817 это может быть полезно
Just code 28.11.2018 07:23

Потому что React будет отображать только обновленную DOM. Вы создаете интервал для обновления состояния A и передаете B в качестве реквизита в A, поэтому каждую секунду A имеет новое состояние, тогда метод рендеринга будет отображать только обновленную DOM. `B`, поскольку опора не меняется, вы передаете ее как статический объект, он не меняется с течением времени, поэтому 'A' не получает никаких изменений. Но когда вы клонируете дочерний элемент, вы делаете его новую копию, поэтому каждую секунду рендерится его новая копия, потому что в любое время, когда изменяется состояние `A`, React запускает метод рендеринга.

Shahram 28.11.2018 08:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
1 404
2

Ответы 2

cloneElement клонировать и возвращать новый элемент React.

Но реагировать элементы неизменны. Создав элемент, вы не можете изменять его дочерние элементы или атрибуты.

Поскольку вы просто возвращаете новую дату в компоненте B, она не будет обновлена. Вам нужно будет использовать дату состояния и сделать то же, что и в компоненте A.

Хотя клонирование работает, это просто потому, что оно возвращает новый элемент реакции. Но props.children вернет тот же элемент и обновит только тогда, когда это потребуется.

{new Date().toLocaleTimeString()} просто возвращает статическую дату.

напишите <B /> direct, это также тот же элемент, и его свойства или состояние не изменятся, но он будет повторно отображен. это меня смутило, потому что я думаю, что у них нет различий. <div> <h5>It is parent{this.state.date.toLocaleTimeString()}.</h5> {this.props.children} <B/> </div>

yemos 28.11.2018 10:34

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

Bhojendra Rauniyar 28.11.2018 11:04

Поскольку B визуализируется как дочерний для A, повторный рендеринг компонента A не будет запускать метод render для component B, и, следовательно, никакие новые обновления не будут сброшены в component B, которым в вашем случае является Date data. Использование React.cloneElement гарантирует, что для дочерних элементов будет создан новый элемент и, следовательно, обновленное значение будет повторно оценено.

спасибо, так как я могу принудительно повторно отрисовать компонент B без использования метода клонирования. Я хочу принудительно обновить его, но B имеет только одну сложную структуру данных в качестве опоры, например <B peer = {complexobject}>, без состояния, B отображает себя сложным объектом.

yemos 28.11.2018 09:12

Вы можете запустить рендеринг B без cloneelement, имея оболочку, которая отображает <A><B/></A> и имеет логику setInterval в своем методе componentDidMount, однако делать это излишне, и лучше использовать cloneElement для вашего случая

Shubham Khatri 28.11.2018 09:39

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