【问题标题】:React component not getting default state反应组件没有获得默认状态
【发布时间】:2021-10-15 10:58:35
【问题描述】:

尝试学习 React/RoR,在这个简单的测试应用程序中,我有一个“searchapp”反应应用程序。这为语言单选框设置了默认值。

import React from 'react'
import ReactDOM from 'react-dom'

import axios from "axios";

import SearchForm from "./searchForm";

class SearchApp extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      searchStrings: [],
      subjectName: "",
      language: 'English',
      region: ""
    };
    this.getSearchStrings = this.getSearchStrings.bind(this);
  }
  componentDidMount() {
    this.getSearchStrings();
  }
  handleClickLang  = changeEvent => {
  this.setState({
    language: changeEvent.target.value
  });
};

  getSearchStrings() {
    axios
      .get("/api/v1/search_strings")
      .then(response => {
        const searchStrings = response.data;
        this.setState({searchStrings});
      })
      .catch(error => {
        console.log(error);
      });
  }
  render() {
    return (
    <>
    <SearchForm />
    </>
  );
  }
}

然后在 searchForm 组件中,我使用该状态来设置和切换两个单选按钮。

class SearchForm extends React.Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.subjRef = React.createRef();
    //this.handleClickLang = this.handleClickLang.bind(this);
  }
  componentDidMount() {
    this.setState({
      language: 'English'
    });
  }
  handleSubmit(e) {
    e.preventDefault();
    window.alert("sometext");
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit} className="my-3">
       <div className="form-row">
       <div className="form-group col-md-8">
       <p>Choose language</p>
       </div>
       <div className="form-row">
       <div className="form-check">
         <label>
           <input
             type="radio"
             name="react-tips"
             value="English"
             checked={this.state.language === 'English'}
             onChange={this.handleClickLang}
             className="form-check-input"
           />
           English
         </label>
       </div>
       <div className="form-check">
         <label>
           <input
             type="radio"
             name="react-tips"
             value="Russian"
             checked={this.state.language === 'Russian'}
             onChange={this.handleClickLang}
             className="form-check-input"
           />
           Russian
         </label>
       </div>

但是,当我运行它时,我收到以下错误: 未捕获的 TypeError:无法读取 null 的属性(正在读取“语言”)

我认为这是错误的,因为它找不到默认语言,但是我在 SearchApp 的构造函数中将语言初始化为“英语”。

这是我对 React 状态的理解不够吗?非常感谢任何帮助。

【问题讨论】:

  • 您似乎没有在SearchForm 构造函数(或类主体)中设置this.state。我不确定componentDidMount 中的this.setState 对此做了什么。也许检查实例化this.state(即使只是一个空对象)是否有帮助,但不幸的是,我目前无法对其进行测试以确认。
  • 谢谢,在我的子组件中添加this.state = {}; 消除了这个错误,我想我以为完整的状态是从应用程序组件自动传递下来的,但似乎不是这样。非常感谢。

标签: reactjs state


【解决方案1】:

在 componentDidMount 中我觉得语言越来越为 null,您可以尝试以下操作:

Trying to learn React/RoR and in this simple test app I have a 'searchapp' react app. That sets a default for the language radioboxes.

import React from 'react'
import ReactDOM from 'react-dom'

import axios from "axios";

import SearchForm from "./searchForm";

class SearchApp extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      searchStrings: [],
      subjectName: "",
      language: 'English',
      region: ""
    };
    this.getSearchStrings = this.getSearchStrings.bind(this);
  }
  componentDidMount() {
    this.getSearchStrings();
  }
  handleClickLang  = changeEvent => {
  this.setState({
    language: changeEvent.target.value
  });
};

  getSearchStrings() {
    axios
      .get("/api/v1/search_strings")
      .then(response => {
        const searchStrings = response.data;
        this.setState({searchStrings,language: 'English'});
      })
      .catch(error => {
        console.log(error);
      });
  }
  render() {
    return (
    <>
    <SearchForm language={this.state.language}/>
    </>
  );
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

并且在 SearchForm 组件中通过 props 传递语言

class SearchForm extends React.Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.subjRef = React.createRef();
    //this.handleClickLang = this.handleClickLang.bind(this);
  }
 
  handleSubmit(e) {
    e.preventDefault();
    window.alert("sometext");
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit} className="my-3">
       <div className="form-row">
       <div className="form-group col-md-8">
       <p>Choose language</p>
       </div>
       <div className="form-row">
       <div className="form-check">
         <label>
           <input
             type="radio"
             name="react-tips"
             value="English"
             checked={this.props.language === 'English'}
             onChange={this.handleClickLang}
             className="form-check-input"
           />
           English
         </label>
       </div>
       <div className="form-check">
         <label>
           <input
             type="radio"
             name="react-tips"
             value="Russian"
             checked={this.props.language === 'Russian'}
             onChange={this.handleClickLang}
             className="form-check-input"
           />
           Russian
         </label>
       </div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

但还有更多的事情:

  • 为什么你在 searchForm 中也有语言状态,你可以在 Search 组件中拥有它并通过 props 传递它
  • 你没有在 SearchForm 组件的构造函数中初始化任何状态

【讨论】:

  • 谢谢 Nacho,不幸的是这似乎没有解决问题。向组件添加 state = {} 似乎已经完成了这项工作。
  • 在我上面的答案的基础上,停止编译的错误是通过初始化子组件中的状态来解决的,但是 Nacho 的这个答案在通过 props 传递访问应用程序中的语言状态时是正确的,传递下来到组件。考虑到这一点,我会接受这个答案,但承认 Nacho 和 Thor84no 在这里都是正确的。谢谢你们。
【解决方案2】:

在此处添加后续内容以供将来参考。

正如@Thor84no 所建议的,问题是没有在子组件中添加state = {} 来初始化状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2018-07-01
    • 2017-07-28
    相关资源
    最近更新 更多