Я делаю подобную систему для своего приложения, и подобная система работает, но проблема в том, что каждый раз мне нужно обновлять страницу, чтобы увидеть обновленную информацию.
function Like(props){
var uID = props.uID //sets userId
var title = props.name //sets tractk title
let userName = props.userName //sets userName
let likeCheck; //only true or false
const [like, setLike] = useState()
useEffect(()=>{
//goes to firebase and check if the value is true or undefined
firebase.database().ref("users/"+uID+"/public/"+"songs/"+title+"/widgetInfo/likes/"+userName).on("child_added", (snapshot)=>{
likeCheck = snapshot.val().liked//stores the value in it
setLike(likeCheck)//sets the value in it
})
}, [])
function sendLike (){
//if like is true then it removes the child
if (like){
firebase.database().ref("users/"+uID+"/public/"+"songs/"+title+"/widgetInfo/likes/"+userName).remove();
}
//if like is undefined, then it adds the child with true value
else{
firebase.database().ref("users/"+uID+"/public/"+"songs/"+title+"/widgetInfo/likes/"+userName).push().set({
"userName": userName,
"liked": true
})
}
}
return(
<div class = "like">
//if like is true then, it shows liked, if false then it shows unliked
<i class = "material-icons" onClick = {sendLike} >{like ? <span>favorite</span> : <span>favorite_border</span> }</i>
</div>
)
}
export default Like
useEffect
?
🤔 А знаете ли вы, что...
JavaScript - это скриптовый язык программирования, разработанный Netscape Communications Corporation.
Вы никогда не изменяете фактическое значение like
в локальном состоянии вашего компонента.
Попробуйте это так:
function sendLike (){
//if like is true then it removes the child
if (like){
setLike(false)
firebase.database().ref("users/"+uID+"/public/"+"songs/"+title+"/widgetInfo/likes/"+userName).remove();
}
//if like is undefined, then it adds the child with true value
else{
setLike(true)
firebase.database().ref("users/"+uID+"/public/"+"songs/"+title+"/widgetInfo/likes/"+userName).push().set({
"userName": userName,
"liked": true
})
}
}
Как сказал Пилчард в своих комментариях, вам нужно использовать хук setLike(), чтобы изменить подобное состояние в вашей функции sendLike().
Ваш компонент будет повторно отображать каждый раз, когда обновляется состояние. В настоящее время с вашим onClick вы обновляете базу данных, но не обновляете состояние компонента. Обновив состояние компонента с помощью хука setLike, вы вызовете повторный рендеринг.
Ваш useEffect() в порядке. Он будет обновлять состояние при начальном рендеринге (только при начальном рендеринге) на основе состояния базы данных.