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

初始渲染时未设置useState的值

杜辰龙
2023-03-14

我开始使用钩子,我遇到了一个问题。

我有一个priceToFilter状态:

const [priceToFilter, setPriceToFilter] = useState(0)

最初设置为0,它在初始渲染时正确渲染0

但问题是,我希望它的值是我使用useffecthook在初始渲染中获取的数组的长度

但是我不知道阵列的长度,直到组件安装完毕。

所以,在这个函数中,我试图访问priceToFilter,但它返回0,因为这是它的初始值。

  function filterResutls() {
    setFilteredResults(results.filter(x =>  {
      return x.stars <= stars && x.price <= priceToFilter
    }))
  }

但是,如果您在使用效果中看到,我将通过setPriceToFilter函数将priceToFilter设置为另一个值。但是,当use效应发生在初始化挂载之后时,它不会获得新值,而是保持为0

关于如何在第一次渲染时获得priceToFilter的更新值,有什么想法吗?

  useEffect(() => {
    fetchHotels(endpoint)
      .then( data => {
        setFilteredResults(data)
        setresults(data)
        const max = Math.max.apply(Math, data.map((x) => x.price ))
        setMaxPrice(max)
        setPriceToFilter(max)
        filterResutls()
      })
      .catch(e => console.log('MAKE SOMETHING IN UI', e))
    }, [endpoint])

共有1个答案

松桐
2023-03-14

您需要添加第二个useffect来收听价格更新,然后相应地过滤结果:

useEffect(() => {
  function filterResutls() {
    setFilteredResults(results.filter(x =>  {
      return x.stars <= stars && x.price <= priceToFilter
    }))
  }

  filterResults();
}, [priceToFilter, stars])

相关功能也应从第一个挂钩中删除:

useEffect(() => {
    fetchHotels(endpoint)
      .then( data => {
        setresults(data)
        const max = Math.max.apply(Math, data.map((x) => x.price ))
        setMaxPrice(max)
        setPriceToFilter(max)
      })
      .catch(e => console.log('MAKE SOMETHING IN UI', e))
    }, [endpoint])

更可靠的方法不是将过滤后的数据存储在状态上,而是在渲染期间将其导出:

 return results
      .filter(x => x.stars <= stars && x.price <= priceToFilter)
      .map(result => <p>Price: {result.price}</p>);
 类似资料:
  • 我有一个非常简单的react应用程序。我试图设置一个状态变量,然后在console.log之后立即设置该变量,但得到一个空值。 我希望在第一次渲染时,它会在控制台中显示“Test”,但它会显示空字符串。这是怎么回事?

  • 可以通过appear特性设置节点在初始渲染的过渡: <transition appear> <!-- ... --> </transition> 这里默认和进入/离开过渡一样,同样也可以自定义 CSS 类名。 <transition appear appear-class="custom-appear-class" appear-to-class="custom-appear

  • 我在函数组件中使用useState(),第一个渲染调用两次。这是正确的还是错误的?如果正确,为什么渲染两次?setCount也会渲染组件两次。 谢啦

  • 页面渲染设置 页面渲染功能开启后能自动加载出网页中的ajax内容 服务器中需要安装谷歌浏览器,支持linux、win系统 centos7安装chrome的命令: wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm yum localinstall google-chrome-stable_

  • 当安装完成并首次启动 Navicat Monitor 时,浏览器会弹出并打开你的 Navicat Monitor 的网址“http://<your_ip_address>:<port_number>”。你需要在欢迎页面完成 Navicat Monitor 的基本配置。 【注意】<your_host_address> 是安装了 Navicat Monitor 的系统的主机名,以及 <port_num

  • 我在Javascript上制作了一个程序,创建了mandelbrot分形,并在html画布上绘制了它。我的渲染方法是每行迭代,从0到500像素,然后简单地循环创建500行500像素。 我的问题是,当我渲染它的时候,(用更多的放大率刷新页面),它需要很多时间。300倍的放大率大约在30秒内工作,但5000倍需要一个多小时。请帮忙。我想有非常高的放大率和图像加载迅速。 我通过一个下载的文件运行我的程序