gpt4 book ai didi

reactjs - React + Firebase 使用钩子(Hook)?

转载 作者:行者123 更新时间:2023-12-02 00:18:38 24 4
gpt4 key购买 nike

我找到了一个很棒的教程,介绍如何将 React 与 Firebase 结合使用,非常简单,只需将文本字段的数据存储在数据库中,但我对如何将其转换为使用 Hooks 感到困惑。我在那里找不到很多关于使用 Hooks + Firebase 的教程,所以我很感激任何帮助!

import React, {useState} from 'react'
import fire from './fire'
import './App.css'

const App = () => {
let [messageList, setMessageList] = useState([])

const handleSubmit = (e) => {
e.preventDefault()
}

return(
<section>
<form onSubmit={handleSubmit}>
<input type="text"></input>
<button>Test</button>
</form>
<span>Messages: {messageList}</span>
</section>
)
}

class ThisWorksButNotWithHooks extends React.Component {
constructor(props) {
super(props);
this.state = { messages: [] }; // <- set up react state
}
componentWillMount(){
/* Create reference to messages in Firebase Database */
let messagesRef = fire.database().ref('messages').orderByKey().limitToLast(100);
messagesRef.on('child_added', snapshot => {
/* Update React state when message is added at Firebase Database */
let message = { text: snapshot.val(), id: snapshot.key };
this.setState({ messages: [message].concat(this.state.messages) });
})
}
addMessage(e){
e.preventDefault(); // <- prevent form submit from reloading the page
/* Send the message to Firebase */
fire.database().ref('messages').push( this.inputEl.value );
this.inputEl.value = ''; // <- clear the input
}
render() {
return (
<form onSubmit={this.addMessage.bind(this)}>
<input type="text" ref={ el => this.inputEl = el }/>
<input type="submit"/>
<ul>
{ /* Render the list of messages */
this.state.messages.map( message => <li key={message.id}>{message.text}</li> )
}
</ul>
</form>
);
}
}

export default App;

我知道它正在与 Firebase 正常通信,因为 ThisWorksButNotWithHooks 有效,感谢 https://www.codementor.io/yurio/all-you-need-is-react-firebase-4v7g9p4kf .我通过查看一个基本的简单示例并通过反复试验从那里开始学习,所以我学得最好,所以如果我知道如何使用 Hooks 做到这一点,我就可以学习更复杂的用法。

谢谢!

最佳答案

像这样的东西应该可以工作。我并没有真正关注您的 Firebase 逻辑或返回的 html,只是展示了如何使用 useEffect 和 useState Hook :

const App = () => {
const [messageList, setMessageList] = useState([])
const [inputEl, setInputEl] = React.useState(null)

React.useEffect(() => {
/* Create reference to messages in Firebase Database */
let messagesRef = fire.database().ref('messages').orderByKey().limitToLast(100);

// As you are using a listener, declare it so it can be returned
const listener = messagesRef.on('child_added', snapshot => {

// Below logic just adds to the current 'messages' state
const message = { text: snapshot.val(), id: snapshot.key };
const updatedMessagesArray = [...messageList].push(message)
setMessageList(updatedMessagesArray)
})

return () => listener() // <== the listener returns the unsubscribe function, which the hook will automatically run when the component unmounts.

}, []) // <== run once onMount

async function addMessage(e){
e.preventDefault(); // <- prevent form submit from reloading the page
/* Send the message to Firebase */
await fire.database().ref('messages').push( inputEl.value );
setInputEl(null)
}

const handleSubmit = (e) => {
e.preventDefault()
}

return(
<section>
<form onSubmit={handleSubmit}>
<input type="text"></input>
<button>Test</button>
</form>
<span>Messages: {messageList}</span>
</section>
)

}

将一个空数组作为第二个参数传递给 useEffect 钩子(Hook)将告诉它只在组件挂载时运行一次,返回监听器将使钩子(Hook)在组件卸载时取消订阅监听器。

关于reactjs - React + Firebase 使用钩子(Hook)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56208207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com