开发者问题收集

检查状态数组是否包含对象 ID,JavaScript

2022-02-28
1169

我正在开发一个必须从 Firestore 数据库获取新订单的应用程序,我使用 componentDidMount 每 10 秒刷新一次屏幕并启动 fetchNewOrders 函数,如果有新订单,该函数应将该对象推送到状态数组 newOrder ,并在下面的 FlatList 中显示订单。当我启动代码时,它返回错误 TypeError: undefined 不是对象(评估'item.id') ,我还编写了一个从数据库获取的数组的示例。

屏幕

export default class Received extends Component {
      constructor(props) {
        super(props);
        this.state = {
          loaded: false,
          newOrder: [],
        };
      }

    async componentDidMount() {
        this.updateTimer = setInterval(() => {
          this.fetchNewOrders();
          }, 10000);
      }
    
        fetchNewOrders = async () => {
            const querySnapshot = await getDocs(collection(db, path));
            if(querySnapshot.length !== 0) {
              querySnapshot.forEach((doc) => {
                let array = this.state.newOrder;
                const data = doc.data().order;
                data.map(({obj, id}) => {
                  const filter = array.find(c => c.id === id);
                  if (filter == undefined) {
                    array.push(obj)
                    this.setState({ newOrder: array })
                  }
                })
              })
            }
          }

render() {

        return (
          <View>
            <FlatList
              data={this.state.newOrder}
              keyExtractor={item => item.id}
              renderItem={({ item }) => {
                return (
                  <TouchableOpacity>
                    <Text>{item.serviceRequested}</Text>
                    <View>
                      <Tex>${item.total}</Text>
                    </View>
                  </TouchableOpacity>
                )
              }}
            />
          </View>
        )
      }
}

数据(新订单)

Array [
  Object {
    "date": "Mon Feb 28 2022 11:24:14 GMT-0500 (EST)",
    "id": 0.9436716663143794,
    "instructions": "",
    "order": Array [
      /////////////
    ],
    "paymentType": "Cash",
    "serviceRequested": "Delivery",
    "total": 10.4,
  },
]
2个回答

setState 是一个异步函数,用于安排渲染新状态。每次渲染时只应调用一次,而不应循环调用。

const append = [];

    querySnapshot.forEach((doc) => {

      const data = doc.data().order;

      // Is there bad data without ids?
      data.filter(c => c.id && !this.state.newOrder.some(no => no.id === c.id))
          .forEach((d) => append.push(d));
    });

    // Create the new state, then set it once.
    this.setState({ newOrder: [...this.state.newOrder, ...append]});
windowsill
2022-02-28

我建议先过滤您的数据 (this.state.newOrder)。这样您就只能显示具有 ID 的项目。

建议更改:

<FlatList
          data={this.state.newOrder.filter((order)=>order.id)}
          keyExtractor={item => item.id}
          renderItem={({ item }) => {
            return (
              <TouchableOpacity>
                <Text>{item.serviceRequested}</Text>
                <View>
                  <Tex>${item.total}</Text>
                </View>
              </TouchableOpacity>
            )
          }}
        />

以上是修复此问题的代码,如所述,但我建议您确保 Firestore 仅发送具有 ID 的数据(如果可能)。显然,这可能超出您的控制范围,但我会确保 Firestore 为您提供可靠的数据,因为它可能会在以后引起更多问题。

Zaedonn
2022-02-28