Реагировать на useEffect, как повторно отображать каждый раз, когда значение обновляется

Я делаю подобную систему для своего приложения, и подобная система работает, но проблема в том, что каждый раз мне нужно обновлять страницу, чтобы увидеть обновленную информацию.

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
If i press like, it shows liked, but when i press unlike, i need to refresh to see the updated result, do i need to put something on dependency array of useEffect?

🤔 А знаете ли вы, что...
JavaScript - это скриптовый язык программирования, разработанный Netscape Communications Corporation.


618
2

Ответы:

Решено

Вы никогда не изменяете фактическое значение 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() в порядке. Он будет обновлять состояние при начальном рендеринге (только при начальном рендеринге) на основе состояния базы данных.