Я новичок в React, и в этом случае я чувствую, что должен использовать крючок жизненного цикла, но я не уверен, какой именно. В приведенном ниже коде я вызываю API и получаю список объектов пользователей, который содержит другой список вещей, которыми они владеют, под названием members. Вот так:
При нажатии кнопки «Отключить» я затем сохраняю ссылку в состоянии и отправляю эту резервную копию в API, чтобы отключить члена:
import React, { Fragment } from 'react';
import FormScene from 'nwiadmin/scenes/form';
import Button from 'nwiadmin/components/button';
import { formatDate } from 'nwiadmin/utility/formatters';
import Modal from 'nwiadmin/components/modal';
import ModalActions from 'nwiadmin/components/modal/modalactions';
import SingleBusinesses from 'app/components/businesses';
let businessRef = '';
class UserBusinessSingleScene extends FormScene {
/* eslint-disable class-methods-use-this */
setInitialState(props) {
const pendingData = {
...props.data,
};
const reference = businessRef;
const isVisible = false;
this.setReferenceTarget = this.setReferenceTarget.bind(this);
return {
pendingData,
reference,
isVisible,
};
}
shouldComponentUpdate(nextProps, nextState) {
console.info('should cmp update', nextProps, nextState);
return true;
}
UNSAFE_componentWillUpdate(nextProps, nextState) {
console.info('cmp will update', nextProps, nextState);
}
componentDidUpdate(prevProps, prevState) {
console.info('cmp did update', prevProps, prevState);
}
setLabel(data) {
return data.name;
}
setMethod() {
return 'post';
}
setRemote() {
return `businesses/unclaim?reference=${this.state.reference}`;
}
modalToggleHander() {
this.setState(prevState => ({
isVisible: !prevState.isVisible,
}));
}
setReferenceTarget() {
this.setState({ reference: businessRef });
}
render() {
console.info(this.state.reference);
return (
<Fragment>
{this.state.pendingData.members.map(business => (
<SingleBusinesses
key = {business.reference}
name = {business.name}
reference = {business.reference}
claimed = {`Claimed on: ${formatDate(business.created_at)}`}
unlink = {
<Button
onClick = {() => {
businessRef = business.reference;
this.setReferenceTarget();
this.modalToggleHander();
}}
>
Unlink User
</Button>
}
/>
))}
<Modal isOpen = {this.state.isVisible} title = "Are you sure you want to unlink the user?">
<ModalActions
submit = {() => this.submit()}
submitText = "Unlink User"
cancel = {() => this.modalToggleHander()}
/>
</Modal>
</Fragment>
);
}
}
export default UserBusinessSingleScene;
После отключения я получаю ошибку Uncaught TypeError: Cannot read property 'map' of undefined. Я не уверен на 100%, почему, но я чувствую, что это как-то связано с состоянием и что я должен установить состояние после отключения? Любая помощь приветствуется.
Это не undefined изначально. Он становится undefined только после установки reference и публикации в businesses/unclaim?reference=${this.state.reference} - как будто он ищет исходное состояние и не находит несвязанного пользователя? Я не могу зарегистрировать итератор, так как он не определен.
зарегистрируйте весь объект. Возможно, вы переопределяете весь объект.
Ой! Вы, кажется, правы: https://i.gyazo.com/4a1e3b67020e6ade63066a86536bfccd.png Это как-то перезаписывает состояние, чтобы быть пустым? Любая идея из приведенного выше кода, как ему это удается?
this.setState({ reference: businessRef }); виноват. Вы можете использовать Object.assign, чтобы объединить обновленный объект с существующим.
Интересно, а где именно будет реализация для этого? Я только что попытался реализовать это следующим образом: const pendingData = Object.assign({ ...props.data }); без изменений. Не уверены, что это правильный подход?
Это работает? Если да, то не беспокойтесь. Сделайте рефакторинг позже. :)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


вы пытаетесь повторить
undefined. зарегистрируйте свой итератор и посмотрите, почему это такundefined. undefined исходит от -this.state.pendingData.members