在 useEffect 中改变状态

时间:2021-07-21 19:27:56

标签: reactjs react-hooks

我正在 useEffect 钩子中调度一个操作来获取数据,然后使用来自 redux 存储的数据更新状态。当页面第一次加载时,我得到了正确的数据,但在刷新浏览器时我得到了未定义的值。

React.useEffect(() => {
    
      dispatch(getSingleCoin(props.match.params.id))
    
     
      setName(coinDetail.name)
      setSymbol(coinDetail.symbol)
      setLogourl(coinDetail.logo)
      setPrice(coinDetail.price)
      setLaunchDate(coinDetail.launchDate)
      setWebsiteUrl(coinDetail.websiteUrl)
      setNetwork(coinDetail.chain)
      setAddress(coinDetail.address)
      setTwitterUrl(coinDetail.twitter)
      setTelegramUrl(coinDetail.telegram)
      setRedditUrl(coinDetail.reddit)
      setYoutubeUrl(coinDetail.youtube)
      setCoinDescription(coinDetail.description)
      setMarketCap(coinDetail.marketCap)
    }
  }, [coinDetail,dispatch, props.match.params.id])
  const handleSubmit = (e) => {
    e.preventDefault()
    const coin = {}
    coin.name = name
    coin.symbol = symbol
    coin.logo = logourl
    coin.price = price
    coin.launchDate = launchDate
    coin.websiteUrl = websiteUrl
    coin.chain = network
    coin.address = address
    coin.twitter = twitterUrl
    coin.telegram = telegramUrl
    coin.reddit = redditUrl
    coin.youtube = youtube
    coin.description = coinDescription
    coin.marketCap = marketCap
    coin._id = props.match.params.id
    dispatch(updateCoin(coin))
  }
  return (
    <div className="container add-coin-wapper mt-4">
      {loading && coinDetail === undefined ? (
        <div>...Loading</div>
      ) : error ? (
        <div>{error}</div>
      ) : (
        <div className="card ">
          <div className="card-header">
            <div className="approve-header">
              <div
                className="approve-back"
                onClick={() => props.history.push('/Admin/coinlist')}
              >
                <ArrowBackIosIcon />
                <div>Back to Coin listing</div>
              </div>
             
            </div>
          </div>
          <div className="card-body">
            {/* here */}

            <>
              <div>
                <h3>Edit Coin</h3>
              </div>
              <form onSubmit={handleSubmit}>
                <div className="row">
                  <div className="col-sm-12 col-md-6 col-lg-6">
                    <h5>Coin informations</h5>

                    <div className="form-group">
                      <label htmlFor="name">name</label>
                      <input
                        type="text"
                        className="form-control"
                        id="name"
                        name="name"
                        placeholder="Bitcoin"
                        required
                        onChange={(e) => setName(e.target.value)}
                        value={name}
                      />
                    </div>
                    <div className="form-group">
                      <label htmlFor="symbol">symbol</label>
                      <input
                        type="text"
                        className="form-control"
                        id="symbol"
                        name="symbol"
                        placeholder="Enter symbol"
                        onChange={(e) => setSymbol(e.target.value)}
                        required
                        value={symbol}
                      />
                    </div>
                    <div className="form-group">
                      <label htmlFor="logo">Logo url</label>
                      <input
                        type="text"
                        className="form-control"
                        id="url"
                        name="logourl"
                        placeholder="https://clod.com/logo"
                        onChange={(e) => setLogourl(e.target.value)}
                        value={logourl}
                      />
                    </div>
                    <div className="form-group">
                      <label htmlFor="description">Coin Description</label>
                      <textarea
                        className="form-control"
                        id="exampleFormControlTextarea1"
                        rows="3"
                        onChange={(e) => setCoinDescription(e.target.value)}
                        placeholder="Describe your coin appropriately to show attractiveness"
                        value={coinDescription}
                      ></textarea>
                    </div>
                    <div className="form-group">
                      <label htmlFor="price">price</label>
                      <div className="input-group mb-2">
                        <div className="input-group-prepend">
                          <div className="input-group-text">$</div>
                        </div>
                        <input
                          type="number"
                          className="form-control"
                          id="marketcap"
                          placeholder="0.00085"
                          step="any"
                          min="0"
                          onChange={(e) => setPrice(e.target.value)}
                          value={price}
                        />
                      </div>
                    </div>
                    <div className="form-group">
                      <label htmlFor="marketcap">Market cap</label>
                      <div className="input-group mb-2">
                        <div className="input-group-prepend">
                          <div className="input-group-text">$</div>
                        </div>
                        <input
                          type="number"
                          className="form-control"
                          id="marketcap"
                          step="any"
                          placeholder="0.00085"
                          min="0"
                          onChange={(e) => setMarketCap(e.target.value)}
                          value={marketCap}
                        />
                      </div>
                    </div>
                    <div className="form-group">
                      <label htmlFor="launchdate">Launch date</label>
                      <div
                        className="input-group date"
                        data-provide="datepicker"
                      >
                        <input
                          type="date"
                          className="form-control"
                          onChange={(e) => setLaunchDate(e.target.value)}
                          value={moment(launchDate).format('YYYY-MM-DD')}
                        />

                        <div className="input-group-addon">
                          <span className="glyphicon glyphicon-th"></span>
                        </div>
                      </div>
                    </div>
                  </div>
                  <div className="col-sm-12 col-md-6 col-lg-6">
                    <h5>Coin market</h5>
                    <div className="form-group">
                      <label htmlFor="network">Network/Chain</label>
                      <select
                        className="form-control"
                        id="network"
                        onChange={(e) => setNetwork(e.target.value)}
                        value={network}
                      >
                        <option value="BSC">Binance Smart Chain (BSC)</option>
                        <option value="ETH">Ethereum (ETH)</option>
                        <option value="SOL">Solona (SOL)</option>
                      </select>
                    </div>
                    <div className="form-group">
                      <label htmlFor="contract">Contract Adress</label>
                      <input
                        type="text"
                        className="form-control"
                        id="contract"
                        name="contract"
                        placeholder="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
                        onChange={(e) => setAddress(e.target.value)}
                        required
                        value={address}
                      />
                    </div>
                    <h5>Coin links</h5>
                    <div className="form-group">
                      <label htmlFor="weburl">Website url</label>
                      <div className="input-group mb-2">
                        <div className="input-group-prepend">
                          <div className="input-group-text">
                            <LanguageIcon />
                          </div>
                        </div>
                        <input
                          type="text"
                          className="form-control"
                          id="web"
                          placeholder="https://www.coinx.com"
                          onChange={(e) => setWebsiteUrl(e.target.value)}
                          required
                          value={websiteUrl}
                        />
                      </div>
                    </div>
                    <div className="form-group">
                      <label htmlFor="twitter">Twitter</label>
                      <div className="input-group mb-2">
                        <div className="input-group-prepend">
                          <div className="input-group-text">
                            <TwitterIcon />
                          </div>
                        </div>
                        <input
                          type="text"
                          className="form-control"
                          id="twitter"
                          placeholder="https://twitter.com/"
                          onChange={(e) => setTwitterUrl(e.target.value)}
                          value={twitterUrl}
                        />
                      </div>
                    </div>
                    <div className="form-group">
                      <label htmlFor="telegram">Telegram</label>
                      <div className="input-group mb-2">
                        <div className="input-group-prepend">
                          <div className="input-group-text">
                            <TelegramIcon />
                          </div>
                        </div>
                        <input
                          type="text"
                          className="form-control"
                          id="telegram"
                          placeholder="https://t.me/"
                          onChange={(e) => setTelegramUrl(e.target.value)}
                          value={telegramUrl}
                        />
                      </div>
                    </div>
                    <div className="form-group">
                      <label htmlFor="youtube">YouTube</label>
                      <div className="input-group mb-2">
                        <div className="input-group-prepend">
                          <div className="input-group-text">
                            <YouTubeIcon />
                          </div>
                        </div>
                        <input
                          type="text"
                          className="form-control"
                          id="youtube"
                          placeholder="https://www.youtube.com/watch?v="
                          onChange={(e) => setYoutubeUrl(e.target.value)}
                          value={youtube}
                        />
                      </div>
                    </div>
                    <div className="form-group">
                      <label htmlFor="reddit">Reddit</label>
                      <div className="input-group mb-2">
                        <div className="input-group-prepend">
                          <div className="input-group-text">
                            <RedditIcon />
                          </div>
                        </div>
                        <input
                          type="text"
                          className="form-control"
                          id="reddit"
                          placeholder="https://www.reddit.com"
                          onChange={(e) => setRedditUrl(e.target.value)}
                          value={redditUrl}
                        />
                      </div>
                    </div>
                    <button type="submit" className="btn" disabled={loading}>
                      update
                    </button>
                  </div>
                </div>
              </form>
            </>

            {/* here */}
          </div>
          {/* here */}
        </div>
      )}
    </div>

状态数据应该显示在表单输入元素中。在获取数据并将加载设置为 false 之前,我渲染了一个具有加载状态的 div。

0 个答案:

没有答案