如何為 3 個選項創建渲染條件?三元運算子對于這個選項是不夠的,我認為我寫的代碼不太好。
import React, { useEffect } from "react";
import { useParams } from "react-router-dom";
import { useSelector } from "react-redux";
import { useDispatch } from "react-redux";
import { getTodoItems, setUrlParams } from "../redux/todoSlice";
import TodoItem from "./TodoItem";
const TodoList = ({ filter }) => {
const { id } = useParams();
const dispatch = useDispatch();
const { searchTerm, todoList } = useSelector((state) => state.todo);
useEffect(() => {
dispatch(getTodoItems(id));
dispatch(setUrlParams( id));
}, [dispatch, id]);
const searchedItems = todoList?.filter((todo) => {
if (!searchTerm) {
return todo;
} else {
return todo?.title.toLowerCase().includes(searchTerm);
}
});
// FROM HERE
const filteredItems = (filter) => {
if (filter === "all") {
return searchedItems?.map((todo, id) => (
<TodoItem key={id} data={todo} />
));
} else if (filter === "active") {
return searchedItems
?.filter((todo) => !todo.isCompleted)
.map((todo, id) => <TodoItem key={id} data={todo} />);
} else if (filter === "done") {
return searchedItems
?.filter((todo) => todo.isCompleted)
.map((todo, id) => <TodoItem key={id} data={todo} />);
}
};
return (
<div>
{filter === "all" && filteredItems("all")}
{filter === "active" && filteredItems("active")}
{filter === "done" && filteredItems("done")}
</div>
);
};
export default TodoList;
你能告訴我如何讓代碼更高效、更簡單嗎?
uj5u.com熱心網友回復:
您可以Object literal在此處使用功能。您可以將您的物件定義filteredItems為物件并使用型別渲染它們。
const filteredItems = (filter) => {
return {
all: searchedItems?.map((todo, id) => <TodoItem key={id} data={todo} />),
active: searchedItems
?.filter((todo) => !todo.completed)
.map((todo, id) => <TodoItem key={id} data={todo} />),
done: searchedItems
?.filter((todo) => todo.completed)
.map((todo, id) => <TodoItem key={id} data={todo} />),
}[filter];
};
return (
<div>
{filterRender(filter)}
</div>
);
uj5u.com熱心網友回復:
我認為這里的主要問題是條件冗余,你做了兩次相同的驗證,我會洗掉所有的if 條件filteredItems并將每個回傳的 TodoItem 移動到他自己的函式中,如下所示:
const TodoList = ({ filter }) => {
const { id } = useParams()
const dispatch = useDispatch()
const { searchTerm, todoList } = useSelector(state => state.todo)
useEffect(() => {
dispatch(getTodoItems(id))
dispatch(setUrlParams( id))
}, [dispatch, id])
const searchedItems = todoList?.filter(todo => {
if (!searchTerm) {
return todo
} else {
return todo?.title.toLowerCase().includes(searchTerm)
}
})
const AllItems = () => {
return searchedItems?.map((todo, id) => <TodoItem key={id} data={todo} />)
}
const activeItems = () => {
return searchedItems
?.filter(todo => !todo.isCompleted)
.map((todo, id) => <TodoItem key={id} data={todo} />)
}
const doneItems = () => {
return searchedItems
?.filter(todo => todo.isCompleted)
.map((todo, id) => <TodoItem key={id} data={todo} />)
}
return (
<div>
{filter === 'all' && AllItems()}
{filter === 'active' && activeItems()}
{filter === 'done' && doneItems()}
</div>
)
}
uj5u.com熱心網友回復:
我可能會做一些過濾器后跟地圖之類的事情。
const filteredItems = (filter) => {
let filtered = searchedItems;
if (filter === "active")
filtered = searchedItems
?.filter((todo) => !todo.isCompleted)
if (filter === "done")
filtered = searchedItems
?.filter((todo) => todo.isCompleted)
return filtered.map((todo, id) => <TodoItem key={id} data={todo} />);
};
return (
<div>
{filteredItems(filter)}
</div>
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468917.html
