【问题标题】:Refresh value react not value after action刷新值反应不是动作后的值
【发布时间】:2020-03-06 00:51:58
【问题描述】:

我在 React 工作了 2 个小时,我对编写器如何正确分离组件有疑问,例如我有这些窗口

当我单击“设置”按钮时,我会更改值 this.state.nameFramework,如果我在 App 组件中编写所有代码,我的 helloApp 工作但如果我在单独的组件中编写代码,它不会立即工作,而是更改变量 this.state.nameframework 的值我已经重新加载了页面。

我的代码

require('normalize.css/normalize.css');
require('styles/App.css');

import React from 'react';
import InputFramework from 'components/InputFramework';
import ListPerson from 'components/ListPerson';

const list = [
  {
    objectID: 1,
    'name': 'Vincenzo',
    'surname': 'Palazzo'
  },
  {
    objectID: 2,
    'name': 'Sara',
    'surname': 'Durante'
  }
];

let name = 'Vincent';
let nameFramework = 'React';

class AppComponent extends React.Component {

  constructor(props){
    super(props);
    this.state = {
      list,
      name,
      nameFramework
    };

    this.onSelectPerson = this.onSelectPerson.bind(this);
    this.onSubmitText = this.onSubmitText.bind(this);
    this.onChangeNameFramework = this.onChangeNameFramework.bind(this);
  }

  onSubmitText(){
    this.setState({nameFramework: this.state.nameFramework});
  }

  onChangeNameFramework(name){
    this.state.nameFramework = name;
  }

  onSelectPerson(name) {
    this.setState({name: name});
  }

  render() {
    //This is no good for my programmer style, resolve it please
    return (
      <div className="index">
        <InputFramework
                  name={this.state.name}
                  nameFramework={this.state.nameFramework}
                  onChange={this.onChangeNameFramework}
                  onClick={this.onSubmitText}
        />
        <ListPerson
          onClick={this.onSelectPerson}
        list={this.state.list}/>
      </div>
    );
  }
}

AppComponent.defaultProps = {
};

export default AppComponent;

输入组件

    require('normalize.css/normalize.css');
    require('styles/App.css');

    import React from 'react';


    class InputFramework extends React.Component {

      constructor(props){
        super(props);
      }

      render() {
        //This is no good for my programmer style, resolve it please
        //The nameFramework not update
        let {onChange, onClick, name} = this.props;
        return (
          <div className='index'>
            <h1>Hello my name is {name} and I'm learning {this.props.nameFramework}</h1>
            <from>
              <input type='text'
                     onChange={event => onChange(event.target.value)}/>
              <button type='submit' onClick={() => onClick}>Set</button>
            </from>
          </div>
        );
      }
    }

    InputFramework.defaultProps = {};

    export default InputFramework;

列表组件

require('normalize.css/normalize.css');
require('styles/App.css');

import React from 'react';

class ListPerson extends React.Component {

  constructor(props){
    super(props);

  }

  render() {
    //This is no good for my programmer style, resolve it please
    const {onClick, list} = this.props;
    return (
      <div className="index">
        <ul>
          {list.map(function(item){
            return (
              <li key={item.objectID}>
                {item.name}
                <button type='button' onClick={() => onClick(item.name)}>Select</button>
              </li>
            )
          })}
        </ul>
      </div>
    );
  }
}

ListPerson.defaultProps = {
};

export default ListPerson;

我这是如何写代码的问题,现在我问你,你比我更有经验,你能帮我解惑吗。

【问题讨论】:

    标签: javascript reactjs binding


    【解决方案1】:

    您正在尝试直接在 onChangeNameFramework 处理程序中更改(变异)状态。

    直接改变状态会导致错误。

    State只能通过this.setState来改变,所以一定是这样的:

      onChangeNameFramework(name){
        this.setState({
          nameFramework: name
        })
      }
    

    这里是文档:

    https://reactjs.org/docs/state-and-lifecycle.html#do-not-modify-state-directly

    另一个问题是在 InputFramework 组件中,当你提交一个页面重新加载的表单时,为了防止它,你应该像这样添加 e.preventDefault():

    class InputFramework extends React.Component {
    
      render() {
        //This is no good for my programmer style, resolve it please
        //The nameFramework not update
        let {onChange, onClick, name} = this.props;
    
        const handleClick = (e) => {
          e.preventDefault();
            onClick();
        }
    
        return (
          <div className='index'>
            <h1>Hello my name is {name} and I'm learning {this.props.nameFramework}</h1>
            <form>
              <input type='text'
                     onChange={event => onChange(event.target.value)}/>
              <button type='submit' onClick={handleClick}>Set</button>
            </form>
          </div>
        );
      }
    }
    

    最后在 AppComponent 中,以下代码是多余的,因为您设置的是相同的状态:

      onSubmitText(){
           this.setState({nameFramework: this.state.nameFramework});
      }
    

    您已经在 onChangeNameFramework 处理程序中处理了框架名称的更改。

    我认为在这里同时使用 onSubmitText 和 onChangeNameFramework 处理程序似乎没有必要,只需其中一个就足够了。

    游乐场:

    https://codesandbox.io/s/blue-frost-qutb0

    【讨论】:

    • 我正在使用函数 onSubmitText 因为我想在提交按钮时更改值,是否存在另一种从输入中获取值的模式?
    • 您已经通过 onChangeNameFramework 获取更改后的框架名称,因此从 onSubmitText 设置它在这种情况下无效。
    • 是的,但是如果我想在单击按钮时更改名称框架,而不是在更改输入文本的值时?
    • @vincenzopalazzo 那么你可以这样做:codesandbox.io/s/pensive-johnson-j2xvl
    • 因为没有它我们不想要的页面刷新
    猜你喜欢
    • 1970-01-01
    • 2015-03-11
    • 2017-12-23
    • 2020-09-29
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多