【问题标题】:Props undefined on access although console shows defined on class access尽管控制台显示在类访问中定义,但在访问时未定义道具
【发布时间】:2021-07-07 08:58:18
【问题描述】:

我正在上课,我必须建立一个网站(我是前端的新手!),但我的教授和 TA 无法帮助我解决这个问题(React 组件,JavaScript)。

一个观察结果是,在 render() 函数中,props 总是被定义。起初我以为它可能没有被安装或一些条件渲染问题,但 String 道具工作的事实可能会抵消这一点?我也尝试过使用<Stock ticker={String(stock.ticker)}/>,以防万一没有传递字符串,但控制台已经显示该变量是字符串道具。 另一个奇怪的现象是,当我更新我的代码并在 npm start 期间保存它时,变量 as prop 突然被定义了。在此之后页面的刷新使其再次未定义。硬编码变量/下载的 json 文件也可以正常工作。

部分组件:

class Stock extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      // some stuff here
    }
  }

  componentDidMount() {
    this.getStock();
  }

  getStock() {
    const key = secretstuff;
    let stock = this.props.ticker;
    console.log(this); // props says defined on console here
    console.log(this.props); // props is undefined on console here
    let call = `https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=${stock}&outputsize=compact&apikey=${key}`;

父页面:

    class Page extends React.Component {
        constructor(props) {
          super(props);
          this.state = {
            stock: {}
          }
        }
      
        componentDidMount() {
          this.getStock();
        }
      
        getStock() {
           const symbol = this.props.match.params.id; // this part works
           // some fetch code, works completely fine to show on page
        }
      
        render() {
            let stock = this.state.stock;
            return (
  <div>
      <h1>{stock.ticker}</h1> // WORKS
         <h2>{stock.name}</h2> // WORKS
             </div>
                <div>
                    <Stock ticker={stock.ticker}/> // DOESN'T WORK!
                           ...... etc ............

【问题讨论】:

  • 那么你的代码在哪里?
  • 更新了部分组件mb

标签: javascript reactjs frontend react-props


【解决方案1】:

您可能使用了错误的this。 在你的构造函数中添加这个来绑定:

this.getStock= this.getStock.bind(this);

【讨论】:

  • class Stock extends React.Component { constructor(props) { super(props); this.state = { //stuff } this.getStock = this.getStock.bind(this); } 喜欢这个?它似乎不起作用(仍然未定义的道具)
  • 好的。什么是未定义的(this 或 this.props)?请在问题中也添加您的父代码。
  • "this" 按照控制台上的定义显示,还显示字符串存储在其道具中。但是,如果您调用“this.props”在控制台上显示,道具会突然显示为未定义。我添加了使用该组件的父代码。
【解决方案2】:

您未包含的“获取代码”可能是异步工作的。

这意味着您的组件将至少呈现两次,一次在 getStock 完成之前和一次之后。

【讨论】:

  • 啊,好的,谢谢!我试着让它等到它不是未定义并且它现在可以工作了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 2018-11-22
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
相关资源
最近更新 更多