#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 ) но кстати, спасибо еще, что очень полезно