【问题标题】:How to use map function before fetch info React js如何在获取信息之前使用地图功能 React js
【发布时间】:2020-08-17 11:40:26
【问题描述】:

我正在用这种结构做一个主页

const Login: React.FC = () => {

  [ ... ]

  return (
    <IonPage>


      <IonContent>

          <IonSlides pager={false} options={slideOpts}>
            {
              responseProducts.content.products.map(function(item,i) {
                return <IonSlide key={i} >
                        <IonCard onClick={Product}>
                          <IonImg src={item.urlImg}></IonImg>
                          <IonCardHeader>
                            <IonCardSubtitle>{item.ref}</IonCardSubtitle>
                            <IonCardTitle>{item.title}</IonCardTitle>
                          </IonCardHeader>
                        </IonCard>
                      </IonSlide>
              })
            }
          </IonSlides>

      </IonContent>
    </IonPage>
  );
};

当我获取服务器 api 时,变量 responseProducts.content.products 是一个产品数组。

我试图在应用程序启动之前获取 api 来初始化变量:

const Login: React.FC = () => {
  /* this is the initialization of my variable with products*/
  let responseProducts : getProductsReponse;
  /* function to fetch the api*/
  useIonViewDidEnter(async () => {
    await fetchProducts();
  });


  const fetchProducts = async() =>{
    await ProductService.getProducts()
      .then((products ) =>{
         responseProducts = products.data;
      })
  }

  return (
    <IonPage>

      <IonContent>

          <IonSlides pager={false} options={slideOpts}>
            {
              responseProducts.content.products.map(function(item,i) {
                return <IonSlide key={i} >
                        <IonCard onClick={Product}>
                          <IonImg src={item.urlImg}></IonImg>
                          <IonCardHeader>
                            <IonCardSubtitle>{item.ref}</IonCardSubtitle>
                            <IonCardTitle>{item.title}</IonCardTitle>
                          </IonCardHeader>
                        </IonCard>
                      </IonSlide>
              })
            }
          </IonSlides>

      </IonContent>
    </IonPage>
  );
};

但是我的产品出现了这个错误:

Variable 'responseProducts' is used before being assigned

【问题讨论】:

    标签: reactjs react-hooks ionic4 react-functional-component


    【解决方案1】:

    [编辑]:要在等待数据时显示不同的内容,您可以执行以下操作:

    if (!responseProducts) return <Loader />;
      else
        return (
          <IonPage>
            ...
          </IonPage>
        );
    

    但是这里你需要触发你的组件的渲染。要么将您的产品置于一个状态并使用 setState,要么在您的父级中处理获取并将您的产品作为 propr 传递(仍然需要一个状态)。


    您的responseProducts 需要一个默认值。您可以使用 useEffect 挂钩和 useState 挂钩来实现:

    const Login: React.FC = () => {
      const [products, setProducts] = useState({});
      const [didMount, setDidMount] = useState(false);
    
      useEffect(() => {
        if(!didMount){
          // I don't know where this comes from so i'll use it like this, adapt if needed
          useIonViewDidEnter(async () => {
            await fetchProducts();
          });
        } else {
          !didMount && setDidMount(true);
        }
      });
    
      /* this is the initialization of my variable with products*/
      let responseProducts: getProductsReponse;
      /* function to fetch the api*/
    
    
      const fetchProducts = async () => {
        await ProductService.getProducts().then((products) => {
          // responseProducts = products.data;
          const data: getProductsReponse = products.data;
          setProducts(data);
        });
      };
    
      // You could even put a different return (a loader for exemple) while your data arent available
      return (
        <IonPage>
          <IonContent>
            <IonSlides pager={false} options={slideOpts}>
              {/* this is now strange, you can adapt what you put in your state */}
              {products.content.products.map((item, i) => {
                return (
                  <IonSlide key={i}>
                    <IonCard onClick={Product}>
                      <IonImg src={item.urlImg}></IonImg>
                      <IonCardHeader>
                        <IonCardSubtitle>{item.ref}</IonCardSubtitle>
                        <IonCardTitle>{item.title}</IonCardTitle>
                      </IonCardHeader>
                    </IonCard>
                  </IonSlide>
                );
              })}
            </IonSlides>
          </IonContent>
        </IonPage>
      );
    };
    
    

    【讨论】:

    • React Hook "useIonViewDidEnter" cannot be called inside a callback. React Hooks must be called in a React function component or a custom React Hook function,看用IonViewDid在react中输入和componentWillMount()一样的函数
    • 哦,那么在您获取数据时显示不同的内容。我不熟悉离子,但我想它可以这样工作。
    • 我是写我想法的答案
    • 它现在可以在没有 useIonViewDidEnter() 的情况下工作并放入我的地图 products?.content.products.map(function(item,i) { ... 非常感谢兄弟
    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2019-04-11
    相关资源
    最近更新 更多