2017-05-20 6 views
0

Ich habe ein Material UI Untermenü von einem Json aufgefüllt. Der Hauptmenüpunkt, der dieses Untermenü enthält, wird entsprechend der Auswahl geändert. Siehe Bild untenÄndern des Wertes eines Elements onclick in ReactJS

enter image description here

Der Hauptmenüpunkt hält die Untermenüs dieser sieht aus wie

<MenuItem 
     primaryText={this.state.selectedLanguage.name} 
     rightIcon={<ArrowDropRight />} 
     style={{userMenuItem}} 
     leftIcon={ 
      <img className="flag" src={this.state.selectedLanguage.icon}/> 
     } 
     menuItems={languageMenu} //see below 
    /> 

Die verschachtelten Menüs kommen von hier

const languageMenu = 
     <div> 
      {languages.map((item, index) => (
       <MenuItem 
        key={index} 
        onClick={this.onLanguageChange} 
        primaryText={languages[index].name} 
        style={{userMenuItem}} 
        leftIcon={ 
         <img className="flag" src={languages[index].icon}/> 
        }/> 
      ))} 
     </div> 

Und schließlich werden die Daten gespeichert in einem JSON wie diesem

const languages = [ 
    { 
     name: 'English', 
     icon: './assets/images/flags/uk.png', 
     link: '' 
    }, 
    { 
     name: 'Español', 
     icon: './assets/images/flags/Spain.png', 
     link: '' 
    }, 
    { 
     name: 'Français', 
     icon: './assets/images/flags/France.png', 
     link: '' 
    } 
... 
]; 

In meinem armen Verständnis von Reaktion, ich einen Anfangswert für die slected Sprache im Zustand des Konstruktor erstellt

constructor(props) { 
    super(props); 
    this.state = {   
     selectedLanguage:{ 
      name:"English", 
      icon:"./assets/images/flags/uk.png", 
     }, 
    } 
} 

und eine Funktion, die den Wechsel behandelt (das ist mein Problem Bereich, ich bin sicher,

)
onLanguageChange =() => this.setState(
    { 
     selectedLanguage: this.state.selectedLanguage.name, 
    } 
); 

ich brauche diese onChange() Funktion bauen korrekt den Zustand im Untermenü basierend zu ändern geklickt. Dies gibt mir die Grundlage, um andere Eigenschaften zu bauen, die ein Übersetzungsfeature auf Klicken auch auslösen werden

Irgendwelche Hilfe wird geschätzt. Dank

+0

Bindungszustand MainMenu-Taste wie, wie Sie es tun in LanguageMenu '' wenn Zustandsänderung, benachrichtigen und verändern. Lesen Sie https://facebook.github.io/react-native/docs/state.html – botika

+0

@botika Ich habe ein paar Dinge geändert. Ich konnte den Wert vom Staat initiieren, das ist gut, weil es jetzt den Staat liest. Ich kann nicht herausfinden, wie man das onLanguageChange() baut, so dass es die Zustandswerte ändert – LOTUSMS

Antwort

1

Die Aktion muss einen Parameter - die neue Sprache:

onLanguageChange = languageName => this.setState({ 
    selectedLanguage: languageName 
}); 

und Sie müssen es, um von onClick:

{languages.map((language, index) => (
    <MenuItem 
     key={index} 
     onClick={() => this.onLanguageChange(language.name)} 
     primaryText={language.name} 
     style={{userMenuItem}} 
     leftIcon={ 
      <img className="flag" src={language.icon}/> 
     } 
    /> 
))} 

Ich bin nicht sicher, ob Sie language in Ihrem speichern möchten Staat oder nur die name. Beide Wege haben ihre Verwendung.

+0

Das klärte meine Untermenüs auf. Es wurde zuerst gesagt, dass Sprache nicht definiert ist, die ich bekomme, weil ich keine Sprache irgendwo habe, also habe ich Sprachen verwendet (der Name meiner JSON-Daten, aber dies führte zu einer leeren Ausgabe in den Untermenüs – LOTUSMS

+0

) Beachten Sie auch, ändern sich der Name und das Symbol – LOTUSMS

+0

Übrigens, der von Ihnen gepostete Menüeintrag ist die Untermenüliste, die einen Repeater mit allen Sprachen in den Daten erstellt und dynamisch so viele Menüeinträge erstellt, dass das Click Event hier stattfinden sollte, aber das MenuItem in meinem ändern muss erster Block, der das Elternmenü ist. Das Bild würde Ihnen eine visuelle geben. Entschuldigung, wenn mein Code unklar scheint. Ich habe versucht, zu vermeiden, zu viel Code hier zu setzen – LOTUSMS

1

So etwas wie dieser

const languages = [...] 


constructor(props) { 
    super(props); 
    this.state = {   
     selectedLanguage: 0 
    } 
} 

onLanguageChange = (index) => this.setState({ selectedLanguage: index }); 

const mainMenu =  
    <MenuItem 
      primaryText={languages[this.state.selectedLanguage].name} 
      rightIcon={<ArrowDropRight />} 
      style={{userMenuItem}} 
      leftIcon={ 
       <img className="flag" src={languages[this.state.selectedLanguage].icon}/> 
      } 
      menuItems={languageMenu} //see below 
    /> 

const languageMenu = 
    <div> 
     {languages.map((item, index) => (
      <MenuItem 
       key={index} 
       onClick={this.onLanguageChange(index)} 
       primaryText={languages[index].name} 
       style={{userMenuItem}} 
       leftIcon={ 
        <img className="flag" src={languages[index].icon}/> 
       }/> 
     ))} 
    </div> 
+0

Das hat nicht funktioniert. FEHLER: Sprache nicht definiert. – LOTUSMS

+0

Ich habe meinen Code in meiner ursprünglichen Frage aktualisiert. Ich weiß nicht, ob du das vorher bemerkt hast. Der Staat hat jedoch sowohl Namen als auch symbolische Werte und wird an den Hauptmenüpunkt übergeben. Alles, was ich jetzt brauche, ist, dass oinClick die Statuswerte basierend auf der Antwort von Sulthan aktualisiert. – LOTUSMS

+0

Sorry, ich vergaß ein s – botika

Verwandte Themen