#javascript #reactjs
Вопрос:
Попытка показать только один элемент div и сбросить все остальные элементы в массиве с помощью крючка useState.
Я создал начальное состояние в виде логического массива, представляющего значение show (true для отображения и false для скрытия) для каждого элемента. Обработчик события onClick передается каждому элементу, который изменит все значения массива как true и изменит единственный элемент, по которому был сделан щелчок, как false в его индексе. Я прикрепил код ниже. Также props.id
содержит индекс/ключ компонента.
Код
import React,{useState} from "react";
import myComponent from "./Components/myComponents.js";
const Add = (props) =>{
const [showVals,changeShowVals]=useState([true,true,true,true,true,true,true]);
const displayHandler=(id)=>{
const x=id;
const vals=new Array(7).fill(true);
vals[x]=!vals[x];
changeShowVals(vals);
}
return(
<div>
{showVals[props.id]?
<myComponent onClick={()=>displayHandler(props.id)}/>:null}
</div>
);
}
export default Add;
Комментарии:
1. вам нужно скрыть компонент по щелчку мыши. так ли это ?
2. Если я правильно понимаю, вы хотите показать один из компонентов, который находится в массиве в позиции
props.id
. Ваш код должен скрывать его, когда вы нажимаете на него, что, похоже, уже делается, и все ранее нажатые элементы будут сброшены до значения true (показано). В вашем заголовке написано «показывать только один элемент, а остальные должны скрываться», в то время как вы говорите о «единственном элементе, на который нажали» в своем вопросе. Чего вы пытаетесь достичь?3. Да, я хочу показать выбранный компонент и сбросить ранее выбранные элементы.
4. Проблема в этом решении заключается в том, что, когда я нажимаю на первую кнопку показать/скрыть, она показывает правильный компонент, но когда я нажимаю вторую кнопку показать/скрыть, она должна скрыть второй компонент и показать первый компонент, который в данном случае, похоже, этого не делает. @СарунУК
5. Да, я предоставлю вам все прямо сейчас
Ответ №1:
Обновил ответ на основе вашего кода.
Вы не определяете обработчик щелчка для Red
компонента.
Мой Компонент:-
import React from "react";
function MyComponent({ onClick, number }) {
const style = {
height: "20px",
width: "20px",
backgroundColor: "red",
margin: "4px",
cursor: "pointer"
};
return (
<div onClick={() => onClick(number)} style={style}>
{number}
</div>
);
}
export default MyComponent;
Компонент приложения:-
import React, { useState } from "react";
import Red from "./red";
import Green from "./green";
const App = () => {
const [showVals, changeShowVals] = useState([
true,
true,
true,
true,
true,
true,
true
]);
const displayHandler = (index) => {
const vals = new Array(7).fill(true);
vals[index] = !vals[index];
changeShowVals(vals);
};
const number = [0, 1, 2, 3, 4, 5, 6];
return number.map((ele, i) =>
showVals[i] ? (
<div onClick={() => displayHandler(ele)}>
<Red number={ele} key={ele " red"} />
</div>
) : (
<Green number={ele} key={ele " green"} />
)
);
};
export default App;
Codesandbox — https://codesandbox.io/s/material-demo-forked-8lgc7?file=/App.js:0-684
Комментарии:
1. codesandbox.io/s/material-demo-forked-s1kdo?file=/App.js Я внес некоторые изменения, я хочу щелкнуть по красному компоненту, чтобы он стал зеленым, и если щелкнуть по любому другому красному компоненту, предыдущий зеленый компонент должен стать красным, а щелкнутый компонент должен стать зеленым.
2. Я обновил код — codesandbox.io/s/material-demo-forked-8lgc7?file=/App.js
3. Причина в том, что вы не определяете обработчик щелчка для красного компонента. Обновлен ответ
4. Значит ли это, что я должен сделать дополнительный div для каждого компонента при попытке обработать прослушиватель событий?
5. Ваш компонент должен обработать это —> возврат ><div style={style}>{props.number}<div style={style}></div> — добавьте обработчик щелчка внутри компонента </div>
Red