reactjs - Πώς να χρησιμοποιήσετε τον πίνακα tanstack v8 για να φιλτράρετε δεδομένα με εύρος ημερομηνιών;
Έχω δεδομένα που προέρχονται από ένα API όπως:
const abc = [
{
date: '2023-12-8',
value: 'mop'
},{
date: '2023-10-8',
value: 'qrs'
}
]
Πώς να συνδέσουμε δύο πεδία εισόδου ώστε να λειτουργούν ως εύρος ημερομηνιών; Η ημερομηνία έρχεται ως συμβολοσειρά, πώς μπορούμε να φιλτράρουμε με βάση αυτές; Ποιος είναι ο καλύτερος τρόπος να λύσουμε αυτό το είδος προβλήματος με εύρος ημερομηνιών;
export const columns: ColumnDef<VTDATA>[] = [
{
accessorKey: "value",
header: "Value",
},
{
accessorKey: "date",
header: "Date",
}]
Απάντηση #1
Αν θέλετε να υλοποιήσετε φιλτράρισμα από την πλευρά του πελάτη, μπορείτε να το κάνετε με αυτόν τον τρόπο:
import { format, parseISO, isAfter, isBefore } from 'date-fns'; // You may need to install the 'date-fns' library
const YourComponent = () => {
const [startDate, setStartDate] = useState(null);
const [endDate, setEndDate] = useState(null);
const filteredData = abc.filter(item => {
const itemDate = parseISO(item.date);
// Check if the item's date is within the selected date range
return (!startDate || isAfter(itemDate, startDate)) && (!endDate || isBefore(itemDate, endDate));
});
// Your render logic and JSX here
return (
<div>
<input
type="date"
value={startDate ? format(startDate, 'yyyy-MM-dd') : ''}
onChange={(e) => setStartDate(new Date(e.target.value))}
/>
<input
type="date"
value={endDate ? format(endDate, 'yyyy-MM-dd') : ''}
onChange={(e) => setEndDate(new Date(e.target.value))}
/>
{/* Render your table with filteredData */}
</div>
);
};
Αν μπορείτε να δώσετε ένα εύρος ημερομηνιών στον διακομιστή για φίλτραρισμα, μπορείτε να το υλοποιήσετε πιο εύκολα:
import { format, parseISO, isAfter, isBefore } from 'date-fns';
const fetchData = async (startDate, endDate) => {
// Your API call logic here, for example using fetch
const response = await fetch(`/api/data?startDate=${format(startDate, 'yyyy-MM-dd')}&endDate=${format(endDate, 'yyyy-MM-dd')}`);
const data = await response.json();
return data;
};
const YourComponent = () => {
const [startDate, setStartDate] = useState(null);
const [endDate, setEndDate] = useState(null);
const { data, isLoading, isError } = useQuery(['data', startDate, endDate], () => fetchData(startDate, endDate));
// Your render logic and JSX here
return (
<div>
<input
type="date"
value={startDate ? format(startDate, 'yyyy-MM-dd') : ''}
onChange={(e) => setStartDate(new Date(e.target.value))}
/>
<input
type="date"
value={endDate ? format(endDate, 'yyyy-MM-dd') : ''}
onChange={(e) => setEndDate(new Date(e.target.value))}
/>
{isLoading && <p>Loading...</p>}
{isError && <p>Error fetching data</p>}
{/* Render your table or other components with data */}
{data && (
<YourDataTable data={data} />
)}
</div>
);
};
