Значение useState не обновляет новое значение, оно просто остается прежним (я предполагаю, что оно меняется на секунду, но возвращается к значению по умолчанию

#javascript #reactjs #react-hooks #use-state

Вопрос:

Функция setvalue() из useState() не обновляет значение при использовании setValue (), хотя кажется, что оно изменилось на секунду и возвращается к значению по умолчанию, пожалуйста, кто-нибудь может рассказать, что здесь происходит

**то, что я здесь делаю, заключается в том, что я просто меняю стиль кода на полужирный (только кнопка, которая была нажата, а затем я делаю стиль кода других кнопок, которые не были нажаты как легкие (я реализовал эту вещь в навигационной панели **

 const [value, setvalue] = useState("home");

useEffect(() => {
    console.log("route has been changed");
    var technology = "web";

    // {
    //  matches == true ? (technology = "web") : (technology = "mobile");
    // }

    if (technology == "web") {
        var home = document.getElementById("home");
        var about_us = document.getElementById("aboutus");
        var competitive_programming = document.getElementById("dropdown-basic");
        var blog = document.getElementById("blog");
        if (loggedIn == false) {
            var login = document.getElementById("login");
        }
        console.log("bold value"   boldvalue)
        switch (boldvalue) {
            case "home":
                console.log("hello home");
                home.style.fontWeight = "600";
                about_us.style.fontWeight = "lighter";
                competitive_programming.style.fontWeight = "lighter";
                blog.style.fontWeight = "lighter";
                if (loggedIn == false) {
                    login.style.fontWeight = "lighter";
                }
                break;
            case "aboutus":
                console.log("hello about");
                home.style.fontWeight = "lighter";
                about_us.style.fontWeight = "600";
                competitive_programming.style.fontWeight = "lighter";
                blog.style.fontWeight = "lighter";
                if (loggedIn == false) {
                    login.style.fontWeight = "lighter";
                }
                break;
            case "blog":
                console.log("hello blog");
                home.style.fontWeight = "lighter";
                about_us.style.fontWeight = "lighter";
                competitive_programming.style.fontWeight = "lighter";
                blog.style.fontWeight = "600";
                if (loggedIn == false) {
                    login.style.fontWeight = "lighter";
                }
                console.log("hello blog");
                break;
            case "login":
                console.log("hello login");
                home.style.fontWeight = "lighter";
                about_us.style.fontWeight = "lighter";
                competitive_programming.style.fontWeight = "lighter";
                blog.style.fontWeight = "lighter";
                if (loggedIn == false) {
                    login.style.fontWeight = "600";
                }
                console.log("login style is "   login.style.fontWeight);
                break;
            case "competitive":
                console.log("hello competitive");
                home.style.fontWeight = "lighter";
                about_us.style.fontWeight = "lighter";
                competitive_programming.style.fontWeight = "600";
                blog.style.fontWeight = "lighter";
                if (loggedIn == false) {
                    login.style.fontWeight = "lighter";
                }
                break;
        }
    }
}, [value]);
//this thing executes whenever I click a button
async function SetBolds(e) {
    // var idid = document.getElementById(e.target.id)
    // console.log(e.target.id);
    var idid = e.target.id;
    // I have console.logged the target id its working fine

    switch (idid) {
        case "home":

            setvalue("home");
            break;
        case "aboutus":

            console.log("about us new")
            setvalue("aboutus");

            break;
        case "blog":
            boldvalue = "blog"
            console.log(boldvalue)
            setvalue("blog");
            break;
        case "login":
            boldvalue = "login"
            setvalue("login");
            break;
        case "dropdown-basic":
            boldvalue = "competitive"
            setvalue("competitive");
            break;
        default:
            setvalue("")
    }
}
 

Комментарии:

1. Почему распределительный ящик в наборах? просто установите значение(idid). Кроме того, невозможно сказать, не зная больше о вашем коде, но похоже, что вы всегда устанавливаете технологию в web в useEffect, которая всегда запускается после рендеринга компонента. Вы не должны манипулировать dom непосредственно в react.

2. Эй, Чарльз Бэмфорд, Да, я сделал так, как ты мне сказал, но все равно это не работает. Что я здесь делаю, так это то, что у меня есть несколько кнопок на панели навигации, и когда я нажимаю любую кнопку, текст этой кнопки должен быть выделен жирным шрифтом, а другие должны быть «светлее». Вот весь код только для справки pastebin.com/dbsQKGqf

3. Если вы знаете какой-либо лучший подход к этому, пожалуйста, дайте мне знать (о выделении выделенного текста жирным шрифтом).

4. codesandbox.io/s/still-sun-brifm?file=/src/App.js Вот как бы я сделал это на тривиальном примере.

5. Спасибо, действительно помогло, хотя я придумала другой способ, так что моей навигации я использовал, <Navlink to="/" activeclassname="IsSelected"> </Navlink> так что этот activeclassname атрибут делает это всякий раз, когда конкретный маршрут по Navlink с тем же 'to' маршруту будет иметь класс ‘изменили реализацию, который прилагается к нему, а потом его все о добавлении укладки класса, это на самом деле очень помочь даже в вы должны проверить это (если вы уже не знаете об этом) ( reactrouter.com/web/api/NavLink ) но кстати, спасибо еще, что очень полезно