执行时向我发送以下错误,您知道我在做什么吗? 我使用了已发布的代码
不变违反:元素类型无效:预期为字符串(对于 内置组件)或类/函数(用于复合组件) 但得到:未定义。您可能忘记了从中导出组件 定义的文件,或者您可能混淆了默认文件并命名为 进口。
检查FlatListDemo的渲染方法。
此错误位于以下位置的:FlatListDemo中(位于withExpoRoot.js:22) ExpoRootComponent中的RootErrorBoundary(withExpoRoot.js:21)(在 RCTView(位于View.js:44)中的RCTView中的renderApplication.js:34)(位于 AppContainer中的View.js:44)(位于renderApplication.js:33)
node_modules \ react-native \ Libraries \ Renderer \ oss \ ReactNativeRenderer-dev.js:5630:10 在createFiberFromElement中 node_modules \ react-native \ Libraries \ Renderer \ oss \ ReactNativeRenderer-dev.js:9710:8 在reconcileSingleElement中...框架中还有21个堆栈框架 内部
import React, { Component } from "react";
import { View, Text, FlatList, ActivityIndicator } from "react-native";
import { List, ListItem, SearchBar } from "react-native-elements";
class FlatListDemo extends Component {
constructor(props) {
super(props);
this.state = {
loading: false,
data: [],
page: 1,
seed: 1,
error: null,
refreshing: false
};
}
componentDidMount() {
this.makeRemoteRequest();
}
makeRemoteRequest = () => {
const { page, seed } = this.state;
const url = `https://randomuser.me/api/?seed=${seed}&page=${page}&results=20`;
this.setState({ loading: true });
fetch(url)
.then(res => res.json())
.then(res => {
this.setState({
data: page === 1 ? res.results : [...this.state.data, ...res.results],
error: res.error || null,
loading: false,
refreshing: false
});
})
.catch(error => {
this.setState({ error, loading: false });
});
};
handleRefresh = () => {
this.setState(
{
page: 1,
seed: this.state.seed + 1,
refreshing: true
},
() => {
this.makeRemoteRequest();
}
);
};
handleLoadMore = () => {
this.setState(
{
page: this.state.page + 1
},
() => {
this.makeRemoteRequest();
}
);
};
renderSeparator = () => {
return (
<View
style={{
height: 1,
width: "86%",
backgroundColor: "#CED0CE",
marginLeft: "14%"
}}
/>
);
};
renderHeader = () => {
return <SearchBar placeholder="Type Here..." lightTheme round />;
};
renderFooter = () => {
if (!this.state.loading) return null;
return (
<View
style={{
paddingVertical: 20,
borderTopWidth: 1,
borderColor: "#CED0CE"
}}
>
<ActivityIndicator animating size="large" />
</View>
);
};
render() {
return (
<List containerStyle={{ borderTopWidth: 0, borderBottomWidth: 0 }}>
<FlatList
data={this.state.data}
renderItem={({ item }) => (
<ListItem
roundAvatar
title={`${item.name.first} ${item.name.last}`}
subtitle={item.email}
avatar={{ uri: item.picture.thumbnail }}
containerStyle={{ borderBottomWidth: 0 }}
/>
)}
keyExtractor={item => item.email}
ItemSeparatorComponent={this.renderSeparator}
ListHeaderComponent={this.renderHeader}
ListFooterComponent={this.renderFooter}
onRefresh={this.handleRefresh}
refreshing={this.state.refreshing}
onEndReached={this.handleLoadMore}
onEndReachedThreshold={50}
/>
</List>
);
}
}
export default FlatListDemo;
答案 0 :(得分:0)
您似乎是在中等https://medium.freecodecamp.org/how-to-build-a-react-native-flatlist-with-realtime-searching-ability-81ad100f6699上学习本教程
不幸的是,本教程是在react-native-elements
升级到v1.0.0
之前编写的。 react-native-elements
升级后,删除了几个组件,并更改了其他组件。有关他们的完整列表,您应该在他们的网站上看到此blog post。在这里重复太长了,但我会重复与您的具体情况相关的部分。
此错误已被删除,可能是导致您尝试导入不再存在的某些错误时看到的大错误的原因。
https://react-native-training.github.io/react-native-elements/blog/2019/01/27/1.0-release.html#list
List
组件已被删除!List
只是常规的React Native 以一些小的边距样式查看。实际上并不需要使用ListItem
组件。相反,我们建议使用FlatList
或 来自React Native的SectionList
个组件均可用作视图 并显示项目,拉动刷新等等。
roundAvatar
和avatar
已被删除,不再使用。
avatar
,avatarStyle
,avatarContainerStyle
,roundAvatar
和avatarOverlayContainerStyle
已删除。现在可以自定义头像 使用rightAvatar
和leftAvatar
道具可以渲染一个 自定义元素或描述Avatar道具的对象。
您有两种选择。
v0.19.1
v1.0.0
重构代码最简单的方法(尽管可能无法工作,因为新版本的react-native可能存在兼容性问题)是降级您的react-native-elements
版本。
您可以通过运行npm uninstall react-native-elements
,然后重新安装特定版本npm install react-native-elements@0.19.1
您可以在https://react-native-training.github.io/react-native-elements/docs/0.19.1/overview.html此处查看v0.19.1
组件的完整列表
另一种选择,也许是更好的选择,尽管可以说它可能需要更多的工作,尽管它可能需要做更多的工作,但它是重构代码,以便它使用v1.0.0
中的新组件。
您可以在https://react-native-training.github.io/react-native-elements/docs/overview.html
v1.0.0
组件的完整列表
答案 1 :(得分:0)
正如安德列斯所说,反应本机元素的属性已更改,因此我将发布在我的案例中起作用的代码。
import React, { Component } from "react";
import { View, Platform, Image, Text, FlatList, ActivityIndicator } from "react-native";
import { ListItem, List } from "react-native-elements";
class FlatListDemo extends Component {
constructor(props) {
super(props);
this.state = {
loading: false,
data: []
}
}
componentDidMount() {
this.makeRemoteRequest();
}
makeRemoteRequest = () => {
const url = 'https://randomuser.me/api/?seed=1&page=1&results=20';
this.setState({ loading: true });
fetch(url)
.then(res => res.json())
.then(res => {
this.setState({
data: res.results,
loading: false,
});
});
};
render() {
return (
<View>
<FlatList
data={this.state.data}
renderItem={({ item }) => (
<ListItem
title={
<View >
<Image style={{height:50}} source={require('./src/img/recarga.jpg')}>
</Image>
<Text>{item.name}</Text>
</View>
}
subtitle={item.email}
/>
)}
keyExtractor={item=>item.email}
/>
</View>
);
}
}
export default FlatListDemo;