Обновить значения отредактированных входов - PullRequest
1 голос
/ 19 сентября 2019

Я использую react-admin framework и пытаюсь динамически обновлять значения моего ввода.

В моем пользовательском компоненте у меня есть метод onChange(), который выглядит следующим образом:

onChange = (value) => {
    this.setState({ currentForm: this.props.record });
    const { updated_src, name, namespace, new_value, existing_value } = value;
    this.setState({ currentForm: updated_src });
 }

Сначала я устанавливаю, что состояние currentForm имеет исходные неотредактированные значения, которые хранятся в this.props.record.После этого я устанавливаю, что состояние имеет новое значение updated_src.Эта переменная хранит объект с новыми отредактированными значениями.Оба объекта this.props.record и updated_src имеют одинаковые ключи.

Позже в render() У меня есть это поле:

{this.props.record && <JsonInput src={this.props.record} name={null} displayDataTypes={false} displayObjectSize={false} onEdit={this.onChange} />}

Однако, если я сделаю console.log(this.state.currentForm); в onChange()метод, он возвращает пустой массив вместо объекта с обновленными значениями поля.

Весь мой компонент:

import React, { Component, Fragment } from 'react';
import { fetchUtils, CardActions, EditButton, Button, List, Datagrid, Edit } from 'react-admin';
import Drawer from '@material-ui/core/Drawer';
import JsonInput from 'react-json-view';
import { Field } from 'redux-form';

import EditIcon from '@material-ui/icons/Edit';
import IconKeyboardArrowRight from '@material-ui/icons/KeyboardArrowRight';
import { SimpleForm } from 'ra-ui-materialui/lib/form';

const divStyle = {
 width: '400px',
 margin: '1em'
};

export default class JsonEditButton extends Component {
 constructor(props, context) {
  super(props, context);
  this.state = { showPanel: false , currentForm: []};
 }

  onChange = (value) => {
    //that works
    this.setState({ currentForm: this.props.record }, () => {
      const { updated_src, name, namespace, new_value, existing_value } = value;
      /* sets the updated values to state */
      this.setState({ currentForm: value.updated_src });
    });
  }

  handleClick = () => {
    this.setState({ showPanel: true });
  };

  handleCloseClick = () => {
    this.setState({ showPanel: false });
  };

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

  return (
    <div>
      <Button label="Upravit JSON" onClick={this.handleClick}>
        <EditIcon />
      </Button>

      <Fragment>
        <Drawer
          anchor="right"
          open={showPanel}
          onClose={this.handleCloseClick}
        >
          <div>
            <Button label="Zavřít" onClick={this.handleCloseClick}>
              <IconKeyboardArrowRight />
            </Button>
          </div>
          <div style={divStyle}>
              {this.props.record && <JsonInput src={this.props.record} name={null} displayDataTypes={false} onKeyPressUpdate={true} displayObjectSize={false} onEdit={this.onChange} />}
          </div>
        </Drawer>
      </Fragment>
    </div>
  );
 }
};

Любые идеи, почему этот код не работает и как решить эту проблемувопрос?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Метод React setState () является асинхронным и завершается только после того, как обработчик onChange () завершен!

0 голосов
/ 19 сентября 2019
onChange = (value) => {
  this.setState({ currentForm: this.props.record },()=>{
  console.log("---currentForm------ >",
    this.state.currentForm,this.props.record)
  this.callFn(value)
});

}
callFn = (value) => {
  const { updated_src, name, namespace, new_value, existing_value } = value;
  this.setState({ currentForm: updated_src },()=>{
  console.log("---->newData",this.state.currentForm,updated_src) 
});
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...