javascript - 在 React 中使用变量更新状态

标签 javascript reactjs

我正在尝试解决我的状态未更新的问题。 我有一个通过 Axios 调用 NASA api 的函数,该函数运行良好。目前,datePicked 状态默认为空,这意味着 GET 请求默认为当前日期。我要添加生成随机日期的功能(函数 onRandomDateClick),一切正常。

然后我想用生成的日期更新 datePicked 的状态,然后运行保存 axios 请求的 onImageGet 函数。

初始状态

  class Photo extends Component {
    state = {
      apiUrl: 'XXXXXXXX',
      apiKey: 'XXXXXXXX',
      image: null,
      imgChecked: false,
      datePicked: ""
    };

生成随机日期、记录变量和状态。状态当前显示为空白。 this.setState 不起作用。

    onRandomDateClick = (e) => {
      function randomDate(start, end) {
        return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
      }
      let randomDateResult = randomDate(new Date(2012, 0, 1), new Date())
      let datePicked = randomDateResult.toISOString().slice(0,10);
      this.setState({datePicked})
      console.log("variable is " + datePicked);
      console.log("state is " + this.state.datePicked);
      this.onImageGet();
    }

Axios 调用此处带有状态

    onImageGet = e => {
      axios.get(`${this.state.apiUrl}?api_key=${this.state.apiKey}&date=${this.state.datePicked}`)
      //response always starts res.data
          .then(res => {
            const image = res.data;
            this.setState({ image })
          })
          this.setState({imgChecked: true})
    }


    render() {
      ...blah blah...
      return (
        <div className="photo">        

         ... blah blah blah ...
        </div>

      );
    }
  }

最佳答案

Js 正在以异步方式进行 http 调用。因为 React setState 是异步的。你应该这样做。

onRandomDateClick = (e) => {
      function randomDate(start, end) {
        return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
      }
      let randomDateResult = randomDate(new Date(2012, 0, 1), new Date())
      let datePicked = randomDateResult.toISOString().slice(0,10);
      this.setState({datePicked},() => {
        this.onImageGet();
      })
    }
    
    onImageGet = e => {
      axios.get(`${this.state.apiUrl}?api_key=${this.state.apiKey}&date=${this.state.datePicked}`)
      //response always starts res.data
          .then(res => {
            const image = res.data;
            this.setState({ image, imgChecked: true })

          })
        
    }
    render() {
      ...blah blah...
      return (
        <div className="photo">        

         ... blah blah blah ...
        </div>

      );
    }
  }

关于javascript - 在 React 中使用变量更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54418879/

相关文章:

javascript - NextJS 在生产构建中错误的 CSS 顺序

javascript - 在 Multer 变量中设置全局变量

javascript - 在 1 级深度上翻转键值对

javascript - 循环遍历 fetch() 调用列表

javascript - 将 JavaScript 检测与 MVC4 显示模式集成的最佳方式是什么?

javascript - 为从索引文件导入的 React 组件设置样式时出错,但直接从组件文件导入时则不会

javascript - 在 React.js 中为新添加的元素设置动画

javascript - 如何在 jQuery 中插入打开的 div?

javascript - React js中的日期转换

javascript - 如何在 ReactJs 中对数组数据进行排序