javascript - 如何修复 React Native Flow Throw Error is Missing Null or Undefined
问题描述
我正在上课React Native
。我正在使用Atom
并Nuclide
用于Flow
制作项目。我正在跟随讲师,但是在每节课之后,我都试图消除 Flow 向我抛出的所有错误。但我真的被困在这件作品上。我收到此错误消息:
无法获取 prevState.selectedPlace.key,因为属性键在 null 或未定义中丢失。
下面是我的代码,我标记了哪一行我得到了placeDeletedHandler
函数中发生的错误。
/**
*
* @format
* @flow
*/
import React, {Component} from 'react';
import {Platform, StyleSheet, View } from 'react-native';
import PlaceInput from "./src/components/PlaceInput/PlaceInput.js";
import PlaceList from "./src/components/PlaceList/PlaceList.js";
import PlaceDetail from "./src/components/PlaceDetail/PlaceDetail.js"
type Props = {};
type State = {
places: Array<Object>,
selectedPlace: ?{
key: string,
name: string,
image: Image
}
};
export default class App extends Component<Props, State> {
state = {
places: [],
selectedPlace: null,
};
placeAddedHandler = (placeName: string) => {
this.setState(prevState => {
return {
places: prevState.places.concat({
key: String(Math.random()),
name: placeName,
image: {
uri: "https://cdn.newsapi.com.au/image/v1/f08d8ccc83fbc2d08529aea69890ad4d?width=1024"
}
})
};
});
};
placeDeletedHandler = () => {
this.setState(prevState => {
return {
places: prevState.places.filter(place => {
return place.key !== prevState.selectedPlace.key; <-- Error on this line
}),
selectedPlace: null
};
});
};
modalClosedHandler = () => {
this.setState({
selectedPlace: null
});
};
placeSelectedHandler = (key : string) => {
this.setState(prevState => {
return {
selectedPlace: prevState.places.find(place => {
return place.key == key;
})
};
});
};
render() {
return (
<View style={styles.container}>
<PlaceDetail
selectedPlace={this.state.selectedPlace}
onItemDeleted={this.placeDeletedHandler}
onModalClosed={this.modalClosedHandler}
/>
<PlaceInput onPlaceAdded={this.placeAddedHandler}/>
<PlaceList
places={this.state.places}
onItemSelected={this.placeSelectedHandler}
/>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 26,
justifyContent: 'flex-start',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
});
我敢肯定其他人可能有类似的问题。我在互联网上挖了几个小时试图解决它。我发现最接近的是这个链接:https ://github.com/facebook/flow/issues/6954
如果有人可以帮助解决这个问题并解释为什么会发生这种情况,我想知道并确保这样做的其他人也想知道。谢谢。
解决方案
您可能正在使用您所在州的类型:
type State = {
selectedPlace: ?{ key: string, ...}
...
}
- 问号表示selectedPlace
可能是null
或undefined
。所以flow
希望你有selectedPlace
定义的安全检查,最简单的方法可能是这样的:
return prevState.selectedPlace && place.key !== prevState.selectedPlace.key
或者,您可以取消标记可能键入 from selectedPlace
。
推荐阅读
- influxdb - Influxdb 2.0 测量、标签、字段
- haskell - Haskell 将 RoseTree 限制在深度 n
- docker - docker push 因未授权而失败:需要身份验证,仅适用于大图像
- python - 在以下情况下无法删除 Python 列表中多次出现的元素(尽管使用了 for 循环)(关闭前请完整阅读!)
- react-native - 使用 Redux Thunk 测试 AsyncStorage
- arrays - 视图函数未返回有效响应。该函数要么返回 None 要么在没有 return 语句的情况下结束
- linked-list - 反转链表时遇到问题
- java - 在Java mongodb中使用find和distinct创建游标
- javascript - 未捕获的类型错误:无法读取 Reactjs 中未定义的属性“地图”-redux
- python - 以帧速率独立(增量时间)移动时精灵口吃 - pygame