【问题标题】:Update values of edited inputs更新已编辑输入的值
【发布时间】:2020-01-20 07:41:00
【问题描述】:

我正在使用react-admin 框架,我正在尝试动态更新我的输入值。

在我的自定义组件中,我有 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.recordupdated_src 两个对象都有相同的键。

稍后在render()我有这个字段:

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

但是,如果我在 onChange() 方法中执行 console.log(this.state.currentForm);,它会返回一个空数组,而不是具有字段更新值的对象。

我的整个组件:

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>
  );
 }
};

任何想法为什么此代码不起作用以及如何解决此问题?

提前谢谢你。

【问题讨论】:

    标签: reactjs field state react-admin


    【解决方案1】:
    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) 
    });
    }
    

    试试这个方法,我认为它应该有帮助, 只需检查这个控制台,你就会得到,为什么你的阵列没有更新

    【讨论】:

    • 刷新页面后值仍然没有更新。我不知道我是否愿意添加某种编辑按钮或其他组件。
    • 你是否在 this.props.record 和 updated_src 中获取数据,请控制台检查
    • 我当然会,我什至不会问如果我一开始没有检查。
    • 我认为可能是您正在犯的其他错误。
    • 我不这么认为,但是如果我 console.log() 它,this.state.currentForm 仍然是一个空数组。
    【解决方案2】:

    React setState() 方法是异步的,只有在你的 onChange() 处理程序完成后才会完成!

    【讨论】:

    • 你能提供一些关于如何解决这个问题的代码吗?谢谢
    • 显示整个组件?
    • 当然,我更新了我的问题。我最终设法使用更新的值设置状态。现在我只需要实际更新输入中的值,所以用新对象的值更新旧对象的值。
    • 我不明白当前的问题,但也许这就是你需要的:componentDidMount() { this.setState({ currentForm: this.props.record }) }
    • 这确实有很大帮助,我现在得到一个变量,它可以根据我如何更改输入值来动态更改其值。但是刷新页面后它仍然没有更新值。任何想法如何做到这一点?谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-12-23
    • 2021-05-02
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多