ReactJS:在superagent ajax请求期间显示带有加载消息的模态

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReactJS:在superagent ajax请求期间显示带有加载消息的模态相关的知识,希望对你有一定的参考价值。

我在ajax请求期间(使用superagent)显示加载消息的模式对话框时遇到问题。

我有一个reactjs应用程序,它有一个输入字段,一个按钮和一个模态区域。我希望它能像这样工作......

  1. 用户在输入字段中插入关键字并单击该按钮。
  2. 单击按钮后,将使用关键字从某个网站获取信息的ajax调用。
  3. 在ajax调用期间,会出现一个显示加载消息的模式对话框。
  4. ajax调用结束后,将关闭模式对话框,并且将在输入字段下列出已被删除的信息列表。

我似乎无法得到3.工作。

这就是我所拥有的:我尝试了一个方法,在ajax调用之前和之后更改模态组件的道具。

任何帮助表示赞赏!

app.js

import React from 'react'
import ReactDOM from 'react-dom'
import PageBody from './pageBody'

ReactDOM.render(
     <PageBody />
    ,document.getElementById('root')
)

pageBody.js

import React, {Component} from 'react'
import Search from './Search'
import Modal from './modal'

export default class PageBody extends Component{
    constructor (props){
        super(props)
        this.state = {
             is_crawling: false
        }
    }

    crawlState (is_crawling) {
        this.setState({is_crawling: is_crawling})
    }

    render () {
        const show_modal = this.state.is_crawling
        this.crawlState = this.crawlState.bind(this)

        return (
            <div>
                <Search crawlState={this.crawlState}/>
                <Modal show_modal={show_modal}/>
            </div>
        )
    }
}

search.js

import React, {Component} from 'react'
import request from 'superagent'

export default class Search extends Component{
    constructor (props) {
        super(props)
        this.state = {
            keyword: ''
            ,result: []
        }
    }

    // method used to make ajax request
    crawl (){
        const keyword = this.state.keyword
        this.props.crawlState(true) // set crawlstate as true to show modal
        request // actual ajax request (superagent)
            .get('/crawl')
            .query({keyword: keyword})
            .end((err, res) => {
                if (err) console.log('superagent failed')
                const r = res.body.result
                this.setState({result: r})
            })
        this.props.crawlState(false) // set crawlstate as false to hide modal
    }

    onChangeHandler (e) {
        this.setState({keyword: e.target.value})
    }

    render () {
        const onChangeHandler = e => this.onChangeHandler(e)
        const crawl = this.crawl()
        const keyword = this.state.keyword
        const arr = this.state.result.map((e, idx) => {
            return <div key={idx}>{e}</div>
        })

        return (
            <div>
                <input type="text" onChange={onChangeHandler} value={keyword} />
                <button onClick={crawl}>CRAWL</button>
                {arr}
            </div>
        )
    }
}

modal.js

import React, {Component} from 'react'

export default class Modal extends Component{
    constructor (props) {
        super(props)
        this.state = {
            show: false
        }
    }

    componentWillReceiveProps(nextProps){
        const show_modal = nextProps.show_modal
        this.setState({show: show_modal})
    }

    render () {
       if (this.state.show){
            return <div id="modal"></div>
        } else {
            return null
        }
    }
}
答案

pageBody.js组件中,你应该绑定构造函数内部的crawlState()函数而不是渲染内部,或者你可以使用像crawlState = () => {}这样的箭头函数

search.js组件中,在this.crawl函数上使用onClick而不是使用新的const变量。

你应该绑定crawl函数以在函数内部使用this并且你在同一级别调用this.props crawlState()而没有任何条件,这意味着你在同一时间调用setState()两次你不应该这样做,所以你应该在this.props crawlState(false)之后调用end请求完成。

pageBody.js

import React, {Component} from 'react'
import Search from './Search'
import Modal from './modal'

export default class PageBody extends Component{
  constructor (props){
    super(props)
    this.state = {
      is_crawling: false
    }
    this.crawlState = this.crawlState.bind(this)

  }

  crawlState (is_crawling) {
    this.setState({is_crawling: is_crawling})
  }

  render () {
    const show_modal = this.state.is_crawling;

    return (
        <div>
          <Search crawlState={this.crawlState}/>
          <Modal show_modal={show_modal}/>
        </div>
    )
  }
}

search.js

import React, {Component} from 'react'
import request from 'superagent'

export default class Search extends Component{
  constructor (props) {
    super(props)
    this.state = {
      keyword: ''
      ,result: []
    }
  }

  // method used to make ajax request
  crawl = () => {
    const keyword = this.state.keyword
    this.props.crawlState(true) // set crawlstate as true to show modal
    request // actual ajax request (superagent)
        .get('/crawl')
        .query({keyword: keyword})
        .end((err, res) => {
          if (err) console.log('superagent failed')
          const r = res.body.result
          this.setState({result: r})
          this.props.crawlState(false) // set crawlstate as false to hide modal
        })
  }

  onChangeHandler (e) {
    this.setState({keyword: e.target.value})
  }

  render () {
    const onChangeHandler = e => this.onChangeHandler(e)
    const keyword = this.state.keyword
    const arr = this.state.result.map((e, idx) => {
      return <div key={idx}>{e}</div>
    })

    return (
        <div>
          <input type="text" onChange={onChangeHandler} value={keyword} />
          <button onClick={this.crawl}>CRAWL</button>
          {arr}
        </div>
    )
  }
}

希望这会帮助你。

以上是关于ReactJS:在superagent ajax请求期间显示带有加载消息的模态的主要内容,如果未能解决你的问题,请参考以下文章

AJAX 加载包含 ReactJS 对象的 php

在使用通量架构完成 ajax 请求后更新 reactjs 上下文

reactjs/flux:按顺序执行动作(ajax)

AJAX 调用 ReactJS 后渲染组件

单击reactjs时如何重新加载表格

vue的ajax