
[英]Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object in ReactJS
[英]Element type is invalid: expected a string or a class/function (for composite components) but got: object
我正在React.js中做一些教程,對此我還很陌生。 我在dashboard.js中有此代碼
import React from 'react';
import NewChatComponent from '../newChat/newChat';
import ChatListComponent from '../chatList/chatList';
import ChatViewComponent from '../chatView/chatView';
import ChatTextBoxComponent from '../chatTextBox/chatTextBox';
import styles from './styles';
import { Button, withStyles } from '@material-ui/core';
const firebase = require("firebase");
class DashboardComponent extends React.Component {
constructor() {
super();
this.state = {
selectedChat: null,
newChatFormVisible: false,
email: null,
friends: [],
chats: []
};
}
render() {
const { classes } = this.props;
if(this.state.email) {
return(
<div className='dashboard-container' id='dashboard-container'>
<ChatListComponent history={this.props.history}
userEmail={this.state.email}
selectChatFn={this.selectChat}
chats={this.state.chats}
selectedChatIndex={this.state.selectedChat}
newChatBtnFn={this.newChatBtnClicked}>
</ChatListComponent>
{
this.state.newChatFormVisible ? null : <ChatViewComponent
user={this.state.email}
chat={this.state.chats[this.state.selectedChat]}>
</ChatViewComponent>
}
{
this.state.selectedChat !== null && !this.state.newChatFormVisible ? <ChatTextBoxComponent userClickedInputFn={this.messageRead} submitMessageFn={this.submitMessage}></ChatTextBoxComponent> : null
}
{
this.state.newChatFormVisible ? <NewChatComponent goToChatFn={this.goToChat} newChatSubmitFn={this.newChatSubmit}></NewChatComponent> : null
}
<Button onClick={this.signOut} className={classes.signOutBtn}>Sign Out</Button>
</div>
);
} else {
return(<div>LOADING....</div>);
}
}
signOut = () => firebase.auth().signOut();
submitMessage = (msg) => {
const docKey = this.buildDocKey(this.state.chats[this.state.selectedChat]
.users
.filter(_usr => _usr !== this.state.email)[0])
firebase
.firestore()
.collection('chats')
.doc(docKey)
.update({
messages: firebase.firestore.FieldValue.arrayUnion({
sender: this.state.email,
message: msg,
timestamp: Date.now()
}),
receiverHasRead: false
});
}
// Always in alphabetical order:
// 'user1:user2'
buildDocKey = (friend) => [this.state.email, friend].sort().join(':');
newChatBtnClicked = () => this.setState({ newChatFormVisible: true, selectedChat: null });
newChatSubmit = async (chatObj) => {
const docKey = this.buildDocKey(chatObj.sendTo);
await
firebase
.firestore()
.collection('chats')
.doc(docKey)
.set({
messages: [{
message: chatObj.message,
sender: this.state.email
}],
users: [this.state.email, chatObj.sendTo],
receiverHasRead: false
})
this.setState({ newChatFormVisible: false });
this.selectChat(this.state.chats.length - 1);
}
selectChat = async (chatIndex) => {
await this.setState({ selectedChat: chatIndex, newChatFormVisible: false });
this.messageRead();
}
goToChat = async (docKey, msg) => {
const usersInChat = docKey.split(':');
const chat = this.state.chats.find(_chat => usersInChat.every(_user => _chat.users.includes(_user)));
this.setState({ newChatFormVisible: false });
await this.selectChat(this.state.chats.indexOf(chat));
this.submitMessage(msg);
}
// Chat index could be different than the one we are currently on in the case
// that we are calling this function from within a loop such as the chatList.
// So we will set a default value and can overwrite it when necessary.
messageRead = () => {
const chatIndex = this.state.selectedChat;
const docKey = this.buildDocKey(this.state.chats[chatIndex].users.filter(_usr => _usr !== this.state.email)[0]);
if(this.clickedMessageWhereNotSender(chatIndex)) {
firebase
.firestore()
.collection('chats')
.doc(docKey)
.update({ receiverHasRead: true });
} else {
console.log('Clicked message where the user was the sender');
}
}
clickedMessageWhereNotSender = (chatIndex) => this.state.chats[chatIndex].messages[this.state.chats[chatIndex].messages.length - 1].sender !== this.state.email;
componentWillMount = () => {
firebase.auth().onAuthStateChanged(async _usr => {
if(!_usr)
this.props.history.push('/login');
else {
await firebase
.firestore()
.collection('chats')
.where('users', 'array-contains', _usr.email)
.onSnapshot(async res => {
const chats = res.docs.map(_doc => _doc.data());
await this.setState({
email: _usr.email,
chats: chats,
friends: []
});
})
}
});
}
}
export default withStyles(styles)(DashboardComponent);
有問題的代碼行是這一行:
newChatBtnClicked = () => this.setState({ newChatFormVisible: true, selectedChat: null });
如果我將newChatFormbVisible:設置為false,則不會得到該錯誤,但是將其設置為true則會失敗,並顯示以下錯誤:-
index.js:1375警告:React.createElement:類型無效-預期為字符串(對於內置組件)或類/函數(對於復合組件),但得到了:對象。 您可能忘記了從定義文件中導出組件,或者可能混淆了默認導入和命名導入。
在dashboard.js:47中檢查代碼。 在Router(已創建)的Route(src / index.js:28)中的WithStyles(DashboardComponent)(由Context.Consumer創建)中的DashboardComponent(由WithStyles(DashboardComponent)創建)中在BrowserRouter控制台中(位於src / index.js:24)。 @ index.js:1375 warningWithoutStack @ react.development.js:188警告@ react.development.js:623 createElementWithValidation @ react.development.js:1785 render @ dashboard.js:44 finishClassComponent @ react-dom.development.js: 15319 updateClassComponent @ react-dom.development.js:15274 beginWork @ react-dom.development.js:16262 performUnitOfWork @ react-dom.development.js:20279 workLoop @ react-dom.development.js:20320 renderRoot @ react-dom .development.js:20400 performWorkOnRoot @ react-dom.development.js:21357 performWork @ react-dom.development.js:21267 performSyncWork @ react-dom.development.js:21241 InteractiveUpdates $ 1 @ react-dom.development.js: 21526 InteractiveUpdates @ react-dom.development.js:2268 dispatchInteractiveEvent @ react-dom.development.js:5085 react-dom.development.js:57未捕獲的不變違規:元素類型無效:預期為字符串(對於內置組件) )或類/函數(用於復合組件),但得到了:對象。 您可能忘記了從定義文件中導出組件,或者可能混淆了默認導入和命名導入。
在評論部分與@Johann討論之后,我只是在寫這個答案。 因此,如果其他人遇到相同類型的錯誤,則更容易看到他們
好的,我不確定,但是您可以嘗試使用帶有自閉標簽的那些組件,例如<ChatViewComponent />
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.