#reactjs #jsx
Вопрос:
Я хочу повторно отобразить компонент, потому что я хочу изменить HTML-код JSX, который я пытался создать, чтобы повторно передать из-за нового изменения состояния.
function todo(props) {
function toggleactive(){
}
if(props.done === true){return (
<div className={Styles.main}>
<div className="flex items-stretch">
<h1>{props.title}</h1>
<button className={Styles.maxleft} onClick={() => toggleactive()}><svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg></button>
</div>
<div className="divide-solid">
</div>
<div className="description">
<p>{props.description}</p>
</div>
<div className="flex space-x-5 justify-end">
<button><svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
</svg></button>
<button><svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z" />
</svg></button>
</div>
</div>
)}
else{
console.log("d")
}
}
и реализуйте его в массиве, подобном этому
<div>
<div className="wd-4/5 flex">
<button onClick={ () => settodos([...todos,{"name":faker.name.jobType(),"title":"d"}])}> new </button><br></br>
<button className="bg-red-600 font-normal font-sans rounded-full text-xl bg-opacity-75 p-1" onClick={() => settodos(deleterandom)}>delete random</button>
</div>
<div className="">
{todos.map(function(idx,dx){
return (<li>{todo({"name":idx.title,"description":"d","title":idx.title,"done":true,"key":uniqueId()})}</li>)
})}
</div>
</div>
теперь я хочу записать код в активную функцию переключения для повторного рендеринга с новой переменной props.value.
Ответ №1:
ты имеешь в виду что-то вроде этого?
const [active, setActive] = useState(false)
function toggleactive(){
setActive(!active)
}
Комментарии:
1. Я пробовал, что это не сработало, потому что вы не можете использовать usestate в операторе if
2. @saeedAlmulla
useState
будет находиться непосредственно внизуfunction todo
, следовательно, не вif
заявлении.3. @SILENT Я хочу установить компонент в одно из двух состояний, активное или неактивное, я делаю это с помощью оператора if, если состояние{ код } еще{ код } Я сделал это с помощью опоры, но проблема в том, что он не перепроверяет(оператор if), когда опора меняется.
Ответ №2:
Есть пара проблем с вашим кодом, начиная с установки вашего ключа uniqueId()
. Идентификаторы должны быть уникальными, но не должны меняться при каждом запуске, как в настоящее время. Вы вызываете не Todo
как правильная функция React.
function Todo({ todo, toggleActive }) {
return (
...
<button className={Styles.maxleft} onClick={() => toggleActive(todo.id)}>
...
);
}
function TodoContainer() {
const [todos, setTodos] = useState([]);
const toggleActive = useCallback((id) => setTodos((ts) => {
const t = ts.find(t => t.id === id);
t.done = !t.done;
return [...ts];
}), []);
return (
...
{todos.map(t => !t.done amp;amp; (<Todo todo={t} toggleActive={toggleActive} key={t.id} />))}
...
);
}
Комментарии:
1. Я уже сделал это, вы можете найти это в моей биографии человека на github