【问题标题】:Passing input state around in react在反应中传递输入状态
【发布时间】:2017-03-24 19:36:57
【问题描述】:

我有一个包含此代码的反应类:

  getInitialState: function(){
    return {
      results: false,
      value: ''
    };
  },

  handleClick: function(event) {
    this.setState({ results: true });
    event.preventDefault();
  },

  handleChange: function(event){
    this.setState({value: event.target.value})
  },

    <input type="text" id="playerName" value={this.state.value} onChange={this.handleChange} placeholder="name" />

在另一个 REACT 课程中

我有:

myFunc: function() {
    this.setState({info: true})
    let name = this.props.value;
    console.log(name) --> returns undefined
  },

我怎样才能命名为等于用户输入的名称,方法是将它从一个反应类传递到另一个反应类

我可以发布更多代码,但我认为 props 是在其他地方传递您需要的代码的方式。 this.state.value 也返回 undefined

编辑:

myFunc 在此处调用:

<input type="submit" value="I can play" onClick={() => this.myFunc()}/>

【问题讨论】:

  • 你需要像this.handleChange.bind(this)这样在handleChange方法中明确绑定this。试试这个,是的,如果它仍然不起作用,请发布更多代码,可以尝试 Codepen 将你的整个代码放在上面。
  • @BasimHennawi 不,不是createClass。如果 OP 使用带有 class 的反应组件,那将是一个问题。
  • 如何设置this.props.value?你能展示使用myFunc的组件吗?
  • @DavinTryon 又添加了一行来显示我调用 myFunc 的位置,还有什么你想看的吗?

标签: javascript reactjs input state


【解决方案1】:

最简单的方法是拥有一个容器组件,这个容器组件将处理所有状态管理并包裹子组件:

<WrapperComponent>
 <Input/>
 <Info />
</WrapperComponent

如果你想做去抖动之类的事情,你的输入仍然可以有自己的状态,但是包装器组件将有自己的函数来设置自己的状态,并将这些函数传递给输入,以便输入可以调用它们它的新值,然后包装器组件将更新,然后 Info 组件将从包装器组件接收其值道具,一切都将同步。

这是一个示例代码笔http://codepen.io/finalfreq/pen/VKPXoN

class Wrapper extends React.Component {    
  constructor() {
  super();
    this.state = {
      value: 'default'
    }
  }

  _handleChange = (value) => {
    this.setState({value: value})  
  };

  render() {
    return (
      <div>
       <Input onChange={this._handleChange} value={this.state.value}/>
       <Info value={this.state.value} />
      </div>
    )
  }
}

class Input extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      value: props.value
    }
  }

  onChange = (e) => {
    this.setState({value: e.target.value});
    this.props.onChange(e.target.value);
  };

  render() {
    return <input type="text" value={this.state.value} onChange={this.onChange} />
  }
}

const Info = (props) => {
  return (
   <h1> {props.value} </h1>
  )
}


ReactDOM.render(<Wrapper />,document.getElementById('app'));

显然,您可以轻松地将其转换为使用 createClass 版本,而不必使用 es6 版本。这里的主要内容是,如果您想在不直接相关的组件之间共享值,那么您肯定会想要一个处理所有事情的状态容器组件。

这是一篇很棒的文章,介绍了容器与演示组件 https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0

【讨论】:

  • 我想我明白了。但问题是一旦我输入它就会在屏幕上设置值。即当我编辑它显示在下面的文本框时,在代码笔上。我想要更多的东西,用户在文本框中输入一个数字值,他们点击提交,然后我可以在代码中的其他位置调用该提交的值..
  • 这有意义吗??
  • 您只需将输入组件更新为有一个按钮,而不是像 props 那样传入 onChange 函数执行 onSubmit 函数。这个想法仍然是相同的,一旦提交发生,您将更新 WrapperComponent。如果你想在 WrapperComponent 之外使用它,你需要使用像 Redux 这样的东西,它提供了可以订阅的存储组件
  • 我更新了笔表单以使用提交按钮codepen.io/finalfreq/pen/VKPXoN
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 2021-07-31
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多