当前位置: 首页 > 知识库问答 >
问题:

componentDidUpdate(prevProps、prevState、snapshot):prevProps未定义

郁烨
2023-03-14

我是相当新的反应,我试图建立这个简单的网络应用程序,将股票标签作为输入,并根据给定股票的表现更新图表。然而,我无法更新我的图表。我尝试使用组件didUpdate(预防道具,预防状态,快照),但出于某种原因,预防道具是未定义的,我不知道/理解为什么。我试着在网上搜索并阅读文档,但我仍然不明白。任何帮助都将不胜感激。

import Search from './Search.js'
import Graph from './Graph.js'
import Sidebar from './Sidebar.js'
import './App.css'
import React, { Component } from 'react';

class App extends Component {

    constructor(props) {
        super(props);
       
        this.state = {
            data: [{
                x: [],
                close: [],
                decreasing: { line: { color: '#FF0000' } },
                high: [],
                increasing: { line: { color: '#7CFC00' } },
                line: { color: 'rgba(31,119,180,1)' },
                low: [],
                open: [],
                type: 'candlestick',
                xaxis: 'x',
                yaxis: 'y'
            }]
            ,
            layout: {
                width: 1500,
                height: 700,
                font: { color: '#fff' },
                title: { text: 'Stock', xanchor: "left", x: 0 }, paper_bgcolor: '#243b55', plot_bgcolor: '#243b55', yaxis: { showgrid: true, color: '#fff' },
                xaxis: {
                    zeroline: true, color: '#fff', showgrid: true, rangeslider: {
                        visible: false
                    }
                }
            },
            searchfield: '',
            stocktag: ' '
        };
        this.onSearchChange = this.onSearchChange.bind(this);
        this.onSubmitSearch = this.onSubmitSearch.bind(this);

    }

    componentDidMount() {
        document.body.style.backgroundColor = '#243b55';
        this.loadGraphInfo();
    }

    componentDidUpdate(prevProps, prevState, snapshot){
        console.log(prevProps.stocktag);
        console.log(prevState.stocktag);

        if (prevProps.stocktag !== prevState.stocktag) {
           //this.fetchData('SPY');
       }
   }

    onSearchChange = (event) => {
        var search = event.target.value;
        this.setState({ stocktag: search });
    }

    onSubmitSearch = (e) => {
        var search = this.state.searchfield;
        this.setState({ stocktag: search });
    }

    fetchData(stock) {
        //GET DATA
        //UPDATE STATE
    }

    loadGraphInfo() {     

        if (this.state.stocktag == ' ') {
            this.fetchData('SPY');
        } else {
            this.fetchData(this.state.stocktag);
        }

       
    }

    render() {
        return (
            <div className="App" >
                <Sidebar />
                <Search searchChange={this.onSearchChange} submitChange={this.onSubmitSearch} />
               <Graph data={this.state.data} layout={this.state.layout} />
            </div>
           
        );
    }
}

export default App;
import React, { Component } from 'react';
import './Search.css'

const Search = ({ searchChange, submitChange }) => {
    return (
        <div>
            <div class="SearchCompInput">
                <input class="SearchBar" type="text" onChange={searchChange}/>
            </div>
            <div class="SearchCompButton">
                <button class="SearchButton" onClick={submitChange}>Search</button>
            </div>
        </div>
    );
}

export default Search;

共有3个答案

吴均
2023-03-14

我有这个问题,这是因为有一个子类调用super.componentdidUpdate()而不传入参数。所以这个子类看起来像:

  componentDidUpdate() {
      super.componentDidUpdate();
      ... <-- other stuff
  }

我不得不把它改成:

  componentDidUpdate(prevProps, prevState) {
      super.componentDidUpdate(prevProps, prevState);
      ... <-- other stuff
  }
颜嘉福
2023-03-14

我不太确定你在这里想要完成什么,但我注意到的第一件事是你设置了stocktag的状态。状态onSubmitSearch函数中为“”的searchfield。

    onSearchChange = (event) => {
        var search = event.target.value;
        this.setState({ stocktag: search });
    }

    onSubmitSearch = (e) => {
        var search = this.state.searchfield;
        this.setState({ stocktag: search });
    }

我还想补充的是,将输入值设置为这样的状态值是一种很好的做法

import React, { Component, useState } from 'react';
import './Search.css'

const Search = ({ searchChange, submitChange }) => {
const [inputValue, setInputValue] = useState('')

  const handleChange = (e) => {
    setInputValue(e.target.value)
    searchChange(e)
  }
    return (
        <div>
            <div class="SearchCompInput">
                <input class="SearchBar" type="text" value = {inputValue} onChange={handleChange}/>
            </div>
            <div class="SearchCompButton">
                <button class="SearchButton" onClick={submitChange}>Search</button>
            </div>
        </div>
    );
}

export default Search;

向杜吟
2023-03-14

道具。stocktag未定义,因为您未向应用程序组件传递任何道具。在你的索引中试试这个。您将看到prepops值,但实际上它没有任何意义。

render(<App stocktag='' />, document.getElementById('root'));

   
componentDidUpdate(prevProps, prevState, snapshot){
        console.log(prevProps.stocktag);
        console.log(prevState.stocktag);

        if (prevProps.stocktag !== prevState.stocktag) {
           //this.fetchData('SPY');
       }
   }
 类似资料:
  • 截图有以下几种方式可以实现: HttpCallback:使用HTTP回调,收到on_publish事件后开启ffmpeg进程截图,收到on_unpublish事件后停止ffmpeg进程。SRS提供了实例,具体参考下面的内容。 Transcoder:转码可以配置为截图,SRS提供了实例,具体参考下面的内容。 HttpCallback 下面的实例使用Http回调截图。 先启动实例Api服务器: pyt

  • 主要内容:SNAPSHOT 是什么,SNAPSHOT 版本 VS RELEASE 版本 ,示例我们知道,Maven 项目第一次构建时,会自动从远程仓库搜索依赖项,并将其下载到本地仓库中。当项目再进行构建时,会直接从本地仓库搜索依赖项并引用,而不会再次向远程仓库获取。这样的设计能够避免项目每次构建时都去远程仓库下载依赖,减轻了网络带宽的压力,但也带来了问题。 大型的应用软件通常由多个功能模块组成,这些模块一般分别于不同的团队负责开发。假设有两个团队,他们分别负责项目中的 app-ui(前端)

  • 每当你想要确保你的UI不会有意外的改变,快照测试是非常有用的工具。 A typical snapshot test case for a mobile app renders a UI component, takes a snapshot, then compares it to a reference snapshot file stored alongside the test. The t

  • 显示图片时,给图片加上边框装饰效果,比如相框、阴影、多张照片叠放等等效果。 [Code4App.com]

  • Maven SNAPSHOT Check Plugin 该插件用来检查 pom.xml 是否包含 SNAPSHOT。 使用 自由风格 job 使用 如果勾选了复选框,它将检查 pom.xml 中是否包含 SNAPSHOT。 如果匹配,该次构建将被标记为失败。 流水线 job 使用 step([$class: 'MavenSnapshotCheck', check: 'true']) 或者 mave

  • 问题内容: 我正在编写一个脚本,该脚本根据下拉列表的高度和输入在屏幕上的位置将下拉列表移动到输入下方或上方。我也想将修改器设置为根据其方向下拉。但是在内部使用会产生无限循环(这很明显) 我已经找到了使用和直接将classname设置为下拉列表的解决方案,但是我觉得应该使用React工具有更好的解决方案。有谁能够帮我? 这是工作代码的一部分(略微忽略了定位逻辑,以简化代码) 这是带有setstate