【问题标题】:How To Extract Value From A Promise And Display It In React?如何从 Promise 中提取价值并在 React 中显示?
【发布时间】:2021-08-24 03:36:44
【问题描述】:

我正在构建一个使用 Supabase 作为后端的 React 应用程序。我想在 React 中显示我的几个 supbase 表中的内容。但是,我承诺会提取这些数据,但我不确定如何在 React 中显示它。以下是我的代码:

SupaBase API Call: 

    async function getData() {
      const {data, other} = await getWriters().then(
        function(response) {
          for (var i = 0; i < response.length; i++) {
            var writerInfo = {}
            writerInfo['username'] = response[i].username
            writerInfo['bio'] = response[i].bio
            // console.log('Writer Name: ', response[i].username);
            // console.log('Writer Bio: ', response[i].bio);
            getTagIds(response[i].writerId).then(
              function(response2) {
                for (var j = 0; j < response2.length; j++) {
                  getTagNames(response2[j].tag_id).then(
                    function(response3) {
                      writerInfo['categories'] = []
                      // console.log('Categories: ')
                      for (var k = 0; k < response3.length; k++) {
                        // console.log(response3[k].tag_name)
                        writerInfo['categories'] = response3[k].tag_name
                      }
                    }
                  )
                }
              }
            )
          }
          return writerInfo['username']
        }
      )
      return data
    }

反应代码:

export default function BrowsePage() {
  const classes = useStyles();
  const [listOfWriters, setListOfWriters] = useState({});

  const fetchData = async () => {
      setListOfWriters(getWriters())
    }


    console.log(getData())

  return (
    <Grid container spacing={3}>
      <Grid item sm={12}>
      <Navbar />
      </Grid>
      <Grid item xs={12} className={classes.root}>
      {getData}
      
      </Grid>
      <Grid item sm={12}>
      <Footer />
      </Grid>
    </Grid>
  );
}

【问题讨论】:

    标签: javascript reactjs asynchronous supabase


    【解决方案1】:
    1. 我创建了一个名为useWriteList 的自定义钩子,这只是另一个函数。看看这个original documentation

    2. useEffect 只是在其依赖数组发生变化时调用提供的回调函数。

    在这种情况下,只在组件第一次渲染时调用一次,因为它是一个空数组。

    所以你可以把它想象成we will call this callback function whenever blabla changes这样的声明。

    由于它只是一个声明,它不会阻塞渲染流程。

    1. 在回调内部,我们等待数据并设置listOfWriters,这最终会导致重新渲染。
        const useWriterList = () => {
          const [listOfWriters, setListOfWriters] = useState([]);
          useEffect(async () => {
            try {
              setListOfWriters(await getData());
            } catch (e) {}
          }, []);
          return listOfWriters;
        };
        
        export default function BrowsePage() {
          //...
          const listOfWriters = useWriterList();
        
          return (
            <Grid container spacing={3}>
              //...
              {listOfWriters.map(writer => (
                <div>
                  {writer.name}
                </div>
              ))}
              //...
            </Grid>
          );
        }
    

    【讨论】:

    • 快速问题:这是因为 useEffects 在渲染时调用 API,然后 React 等待 useEffects 完成?另外,你为什么在组件之外写这个?
    猜你喜欢
    • 2021-05-24
    • 1970-01-01
    • 2020-04-30
    • 2018-02-24
    • 1970-01-01
    • 2021-06-06
    • 2019-02-05
    • 2017-11-01
    • 2011-11-12
    相关资源
    最近更新 更多