Есть ли проблема с установкой состояния React.Component равным значению this.props в машинописном тексте?

Я пытаюсь назначить объект, который передается в React.Component как свойство, такому значению состояния,

state = {
    rota: this.props.rota
}

render() {
    // const { cleaning, chairs, creche, flowers } = this.state.rota;
    const { cleaning, chairs, creche, flowers } = this.props.rota;

    console.info(creche);
}

Закомментированный раздел, где он получает значение состояния, распечатывает пустую строку, однако значения свойств верны. Я что-то делаю неправильно при назначении props.rota на state.rota?

Я использую машинописный текст и сделал именно это в другом месте своей программы, однако передаваемое свойство было типом значения (строкой), а не типом объекта.

Спасибо!

Где вы устанавливаете это состояние? Если он находится внутри конструктора, то на этом этапе реквизиты не инициализируются, так что это может быть вашей проблемой. Вместо этого попробуйте использовать getDerivedStateFromProps, который на самом деле предназначен именно для этого случая (reactjs.org/docs/…)

Dr_Derp 03.01.2019 20:06

зачем вам это делать, если вы в любом случае передаете реквизиты компоненту? если вы хотите, чтобы снимок свойств отображал состояние, вы можете использовать componentDidUpdate (prev, next) {this.setState ()}

Joelgullander 03.01.2019 20:07

@joelgullander componentWillReceiveProps устарел. Вы не должны использовать это

quirimmo 03.01.2019 20:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Обычно это плохая практика.

Возьми свой случай.

Вы получаете значение как опору от родительского компонента.

Внутренний компонент уже будет повторно визуализироваться каждый раз, когда это значение изменяется в родительском компоненте.

Если вы воспользуетесь подходом, подобным вашему, то, что, скорее всего, вы сделаете, это также измените это значение внутри внутреннего компонента (через состояние), изменения которого не будут отражены на родительском компоненте.

Фактически вы нарушаете шаблон проектирования однонаправленного потока данных, от которого во многом зависит реакция.

Так что мое личное мнение - в данном случае нужно поднять состояние и избегать подобных ситуаций. Вместо этого используйте обратные вызовы, если вы хотите сообщить об изменениях родительскому объекту или использовать некоторое управление состоянием (контекст, сокращение и т. д.).

Или спроектируйте лучшее решение, используя HOC или компоненты рендеринга props.

Моя причина в том, что этот компонент является модальной формой ввода - я передаю начальные значения для некоторых текстовых полей, которые могут / не могут быть изменены - при передаче изменений я хочу включить только новые изменения и сохранить любые неизменные значения . Отвечая вам, я подумал о возможном способе исправить это, поскольку я знаю, что props-state - это антипаттерн!

Tristan Trainer 03.01.2019 20:11

Используйте обратный вызов, переданный от родительского компонента к внутреннему, который будет вызываться, когда модальное окно будет закрыто, передавая новые значения обратно родительскому компоненту. Затем обновите родительский элемент внутри этого обратного вызова

quirimmo 03.01.2019 20:12

Несмотря на то, что @quirimmo в значительной степени ответил на ваш вопрос, если вы хотите сделать это когда-нибудь в будущем, самым простым способом было бы использовать функцию конструктора и передать реквизиты в качестве параметра, а затем просто установить это как значение по умолчанию государства

class SomeComponent extends Component {
    constructor(props){
        super(props);
        this.state = {
             rota: props.rota,
        }
    }
}

Это гарантирует, что опора действительно доступна в тот момент, когда вы хотите установить начальное состояние, поскольку конструктор - это первая функция, которая вызывается в жизненном цикле компонента.

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