JavaScript: Wie kann ich Daten zwischen zwei Dateien verteilen?

1 Antwort

Edit:

Ich war etwas kurz angebunden und habe deine Frage mangels Syntax-Hervorhebung (was jetzt korrigiert wurde) völlig falsch verstanden. Daher jetzt nochmal als Nachtrag darauf eingehen möchte. Um die ausgewählten Werte an die Tabelle weiterzugeben, muss der Zustand der Filter in der App.js (u.a. useState) verwaltet werden.

Die ausgewählten Werte aus der Filter-Komponente werden mit einer Callback-Funktion an die App.js übergeben und in dann in der useState gespeichert. Du kannst sie dann von dort aus als Props an die Tabellen-Komponente durchreichen. Wenn der User die Werte der Filter verändert, wird die Tabelle dynamisch aktualisiert.

Ich würde zudem das State-Management anpassen und dahingehend optimieren, indem unnötige Teile rausfliegen oder gekürzt werden. Dasselbe gilt für deine Imports, die sich auch kompakter schreiben lassen. Da musst du nicht immer wieder für jede Komponente von Material UI einen eigenen Import schreiben.

App.js

import { useState } from "react"; 
import { Titelleiste } from "./Titelleiste"; 
import { Filter } from "./Filter"; 
import { Tabelle } from "./Tabelle"; 

function App() { 
  // State für beide Filter
  const [filter, setFilter] = useState({ service: "", anbieter: ""}); 
  // Update (service und anbieter)
  const handleFilterChange = (key, value) => {
   setFilter((prev) => ({ ...prev, [key]: value })); 
  }; 

  return (
    <div className="App"> <Titelleiste /> 
    <Filter onFilterChange={handleFilterChange} /> 
    <Tabelle filter={filter} /> </div> 
  ); 
} 

export default App;

Filter.js

import { FormControl, InputLabel, MenuItem, Select } from "@mui/material";
import data from "./data/tableData.json"; 

export const Filter = ({ onFilterChange }) => {
  // Werte für service
  const array_service = [...new Set(data.map((item) => item.service))]; 
  // Werte für anbieter
  const array_anbieter = [...new Set(data.map((item) => item.anbieter))]; 

  // Handler für Eingaben
  const handleChange = (key) => (e) => {
    onFilterChange(key, e.target.value); 
  }; 

  return ( 
    <div>
      <FormControl sx={{ width: 100 }}>
        <InputLabel>Service</InputLabel>
        <Select onChange={handleChange("service")}>
          {array_service.map((service) => (
            <MenuItem key={service} value={service}>
              {service} 
            </MenuItem>
          ))} 
        </Select> 
      </FormControl>     

      <FormControl sx={{ width: 100, marginLeft: 2 }}>
        <InputLabel>Anbieter</InputLabel> 
        <Select onChange={handleChange("anbieter")}>
          {array_anbieter.map((anbieter) => (
            <MenuItem key={anbieter} value={anbieter}>
              {anbieter} 
            </MenuItem> 
          ))} 
        </Select> 
      </FormControl> 
    </div> 
  ); 
};

Tabelle.js

import data from "./data/tableData.json";

export const Tabelle = ({ filter }) => {
  // Gefiltere Daten (ausgewählte Filter)
  const filteredData = data.filter((item) => {
    return (
      (!filter.service || item.service === filter.service) &&
      (!filter.anbieter || item.anbieter === filter.anbieter)
    );
  });

  return (
    <div className="tabelle">
      {filteredData.length > 0 ? (
        <table>
          <thead>
            <tr>
              <th>Service</th>
              <th>Anbieter</th>
            </tr>
          </thead>
          <tbody>
            {filteredData.map((row) => (
              <tr key={row.id}>
                <td>{row.service}</td>
                <td>{row.anbieter}</td>
              </tr>
            ))}
          </tbody>
        </table>
      ) : (
        <div>Keine Daten verfügbar</div>
      )}
    </div>
  );
};
Woher ich das weiß:Berufserfahrung – Full-Stack Developer