【问题标题】:Getting value from react component从反应组件中获取价值
【发布时间】:2018-07-11 04:22:54
【问题描述】:

我有一个组件 InputArea 和 state = {input: ''}

然后我将其中几个组件映射到一个容器中,并将它们写入state = {inputAreas: []}

现在,如何在容器中获取输入?记录 this.state.inputAreas[0] 会返回如下对象:

{$$typeof: Symbol(react.element), type: ƒ, key: "1", ref: null, props: {…}, …}

在元素中显示如下:

<input type="text" class="form-control" name="input" value="abc">

使用 this.state.prefooterArea[0].value 给出未定义。

我也尝试将输入从组件传递到容器作为道具,但它显示getInput is not a function。据我了解,这与我在容器中使用 map 的事实有关。我不能在这个项目中使用 redux。

组件代码

class PrefooterAreaInput extends Component {
  state = {
    input: ''
  }

  textChangedHandler = (event) => {
    let newState = {};
    newState[event.target.name] = event.target.value;
    this.setState(newState);
  }

  render() {
    return (
      <div>
        <input
          className="form-control"
          type="text"
          name="input"
          value = {this.state.input}
          onChange={this.textChangedHandler}
        />
      </div>
    )
  }
}

容器代码

class DescriptionFrame extends Component {
  state = {,
    prefooterArea: [<PrefooterAreaInput key={1}/>]
  };

  addFooterInputHandler = event => {
    event.preventDefault();
    if (this.state.prefooterArea.length < prefooterInputFieldsMax) {
      var newPrefooterArea = this.state.prefooterArea.map(
        inputField => inputField
      );
      newPrefooterArea.push(
        <PrefooterAreaInput key={this.state.prefooterArea.length + 1} />
      );
      this.setState({ prefooterArea: newPrefooterArea });
    }
  };

  removeFooterInputHandler = event => {
    event.preventDefault();
    if (this.state.prefooterArea.length > 1) {
      var newPrefooterArea = this.state.prefooterArea.map(
        inputField => inputField
      );
      newPrefooterArea.splice(newPrefooterArea.length - 1);
      this.setState({ prefooterArea: newPrefooterArea });
    }
  render() {
    // want to get this.state.prefooterArea[0]'s value 
    return (
      <div>
        {this.state.prefooterArea}
          <a
            className="nav-link"
            href=""
            onClick={this.addFooterInputHandler}
          >
            Add More
          </a>
          <a
            className="nav-link"
            href=""
            onClick={this.removeFooterInputHandler}
          >
            Remove Last
          </a>
      </div>
    );
  }
}

【问题讨论】:

  • 你能详细解释一下你想要完成什么吗?提供更多信息
  • 我正在尝试在容器中获取输入值。容器状态中有一个组件列表,每个组件都以自己的状态存储输入。
  • 但是为什么要引用整个元素,为什么不只存储输入值呢?
  • @MarioNikolaus 是的。 key 是道具吗?那么只有您可以将其添加为自定义组件的属性。因为 that(PrefooterAreaInput) 不是在 JSX.HTMLElement 类别的组件中构建的。无需在this.state.input 的输入中分配value attr。

标签: javascript reactjs


【解决方案1】:

想通了。这导致了问题。

prefooterArea: [<PrefooterAreaInput key={1}/>]

我应该使用生命周期方法添加初始 PrefooterAreaInput。有了这个,我就能很好地通过状态。

【讨论】:

    【解决方案2】:

    您是否正在尝试实现这样的目标?

    子组件:

    export default class InputBox extends React.Component {
    render() {
        return (
                <input onChange={event => this.props.onChange(event.target.value)} />
    
        );
    }} 
    

    父组件:

       import InputBox from './InputBox';
    
        class FilterBar extends React.Component {
            constructor(props) {
                super(props);
                this.state = {
                    inputs: "" //get input value from state this  input
                };
               this.updateFilters = this.updateFilters.bind(this);
            }
    
           updateFilters(i) {
               this.setState({ inputs: i }); // this will print whatever input you type
           }
    
            render() {
               return (
                 <div>
                     <InputBox onChange={(i) => this.updateFilters(i)} />
                 </div>
            );
        }
    }
    

    【讨论】:

    • 是的,类似的。我将编辑我的帖子以包含更多代码。
    • 完成。整个文件太大了,所以我不得不裁剪相关代码。
    • 你能解释一下你的输入和预期的输出,比如点击 addFooterInputHandler 时会显示输入的值,在 removeFooterInputHandler 后会被删除吗?我可以看到您在 DescriptionFrame 中将 PrefooterAreaInput 组件设置为状态,不建议将组件置于状态
    • 如果您想将输入值从子组件传递给父组件,请在您的子组件中尝试这样的反应: this.props.onChange(event.target.value)} { ...其他道具} />
    • 我的输入是我输入的任何内容。正如我所说,我尝试将子输入作为道具传递,但它说“不是函数”
    猜你喜欢
    • 2018-05-30
    • 1970-01-01
    • 2021-11-10
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2019-02-01
    相关资源
    最近更新 更多