【问题标题】:pass data into component with 'let' keyword使用“let”关键字将数据传递给组件
【发布时间】:2020-10-17 03:07:54
【问题描述】:

在运行 graphql 查询后,我试图将一些数据传递到我的 FlatList 组件中。如果我使用const DATA对数据进行硬编码,它可以工作。但是,如果我定义两种情况(成功查询和不成功查询)并使用let DATA,则变量不会正确传递到 FlatList 中,并且它们在 FlatList 组件中始终未定义。

我该如何解决这个问题? 我怎样才能确保DATA 仅在查询运行后传递到FlatList

例如,像这样的硬编码数据有效:

const DATA = [
  {
    id: '1',
    imageUrl: defaultUrl,
    name: 'Friend',
    vehicles: [],
    rating: 1,
    numberOfFriends: 3,
  }
];

但这不是(尽管查询工作正常):

let DATA;
 const { data, error } = useGetMyProfileQuery({
    onCompleted: () => {
      console.log('frineds', data.me.friends)
      DATA = data.me.friends.map(
        (item: {
            firstName: string;
            id: number;
            rating: number;
            vehicles: Array<Vehicle>;
            friends: Array<User>;
          
        }) => ({
          id: item.id,
          imageUrl: defaultUrl,
          name: item.firstName,
          rating: item.rating,
          //vehicles: item.vehicles,
          vehicles: [],
          numberOfFriends: item.friends.length,
        }),
      );
    },
    onError: ()=> {
          DATA = [
            {
              id: '1',
              imageUrl: defaultUrl,
              name: 'Friend',
              vehicles: [],
              rating: 1,
              numberOfFriends: 3,
            }
        }
  });

平面列表:

        <FlatList
          showsHorizontalScrollIndicator={false}
          data={DATA}
          horizontal={true}
          //scrollEnabled
          renderItem={({ item }) => (
            <WhitelistItem
              title={item.name}
              face={item.imageUrl}
              firstName={item.name}
              rating={item.rating}
              numberOfFriends={item.numberOfFriends}
              vehicles={item.vehicles}
            />
          )}
          keyExtractor={(item) => item.id}
        />

编辑:

我知道 setStates,但这能保证每次查询重新运行时,数据都会更新吗?还是我必须使用 useEffect 等?过去我用useStates的时候,数据经常不会自动更新,老是给老数据,所以找了个替代方法

【问题讨论】:

标签: javascript reactjs typescript react-native react-native-flatlist


【解决方案1】:

you should use hooks or class based state in that case, as thats the only way to update your component to render new incoming data, there is also the option of force updating the component but that one is not reliable

使用 useState 钩子可以设置 DATA 变量并重新渲染组件以填充数组

import React, {useState} from 'react'

const YourComponent = () => {

    const [DATA, setDATA] = useState([]);


    const { data, error } = useGetMyProfileQuery({
        onCompleted: () => {
          console.log('frineds', data.me.friends)
          let tmpData = data.me.friends.map((
              item: {
                firstName: string;
                id: number;
                rating: number;
                vehicles: Array<Vehicle>;
                friends: Array<User>;
              
            }) => ({
              id: item.id,
              imageUrl: defaultUrl,
              name: item.firstName,
              rating: item.rating,
              //vehicles: item.vehicles,
              vehicles: [],
              numberOfFriends: item.friends.length,
            }),
          );

          setDATA(tmpData)
        },
        onError: ()=> {
            tmpData = [{
                  id: '1',
                  imageUrl: defaultUrl,
                  name: 'Friend',
                  vehicles: [],
                  rating: 1,
                  numberOfFriends: 3,
            }]

            setDATA(tmpData)
        }
      });
}

【讨论】:

  • 这样能保证每次重新运行查询,数据都会更新吗?以前我用useStates的时候,数据经常没有自动更新,老是给老数据
  • 好吧,如果查询重新运行,那将通过这个 HOC useGetMyProfileQuery,因为在这种情况下,你已经包含了一个更新数据的函数'setDATA'函数,这几乎可以保证状态将是重置为新数据,这意味着组件将重新渲染
  • 但是在设置新数据之前,旧的data是否有可能再次传递给flatList
  • 另外,对于``` setDATA(tmpData)on the onErrorcase, I get an error that argument 这种类型的参数不能分配给'SetStateAction'类型的参数。If I change useState ([]);``` 到useState&lt;any&gt;()然后它可以正常工作,但使用any。不是个好主意
  • 不可能传递旧数据,因为您将它们存储在状态中,除非您使用旧数据设置状态,但这不会在您设置的代码上发生回调结果的新状态。您正在使用打字稿,这就是您收到类型转换错误的原因,我在没有静态类型的 javascript 上编写了它。你很擅长使用
【解决方案2】:

在这里,当您将 DATA 传递给 flatlist 时,它当时没有获取值。这就是您在传递 DATA 时收到错误的原因。

您应该以某种方式等待,直到 DATA 获得所需的值。 也可以根据条件绑定flatlist的渲染。

【讨论】:

    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2023-03-21
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多