2
votes

Comment sélectionner plusieurs valeurs dans une liste plate en fonction de leur clé

J'utilise la puissante flatlist de react native c'est mon tableau qui ressemble à ceci:

<TouchableOpacity
                        onPress={() => this._handleCategoryColor(index, item,objectname)}

                        style={[
                          styles.Buttoncolor,

                          this.state.selected.indexOf(item.label) != -1
                            ? styles.onfocusbutton
                            : null,
                        ]}>
                        <Text
                          style={[
                            styles.textcolor,
                            this.state.selected.indexOf(item.label) != -1
                              ? styles.white
                              : null,
                          ]}>
                          {item.label}

                        </Text>
                      </TouchableOpacity>

et voici ma flatlist

_handleclick = (index, item,objectname) => {
         const {selected,result} = this.state
         let selectedIndex = this.state.selected.indexOf(item.value);
            if(selectedIndex == -1){
           let my =   this.state.result.filter((e)=>{return e[objectname]})
             selected.forEach((items) => {
                    let arrayofattribute =   result.filter((e)=>{return e[objectname]})
                    arrayofattribute.forEach((value,index)=>{
                    newval =  value[objectname].map((val,i)=>{
                        if(items == val.label)
                        {
                          selected.splice(selected.indexOf(val.label),1)
                        }
                      })
                    })
             })
            this.setState({selected:[item.label,...this.state.selected]})
          }
      }

c'est la fonction où je correspond à l'index de l'élément ..

  _handleclick = (index, item) => {
        this.setState({selected: index+item.label, selectedColor: item.value})
      }

voici ce que j'ai essayé: ->

j'appelle le clic de la main la fonction correspond à sa valeur avec l'index + le nom de l'étiquette et elle est modifiée elle-même mais quand je clique sur BLEU il change de couleur mais quand je clique sur PETIT il peut changer de lui-même mais le bleu obtient sa condition précédente

voici maintenant ce que je veux faire: ->

Je veux sélectionner un seul élément basé sur le tableau qui est 'Couleur ' Je veux que lorsque je clique sur BLEU, cela puisse changer la couleur. et si je clique aussi sur PETIT, il peut aussi changer de couleur lui-même que deux valeurs doivent être stockées.

J'espère que vous pourriez facilement comprendre. merci d'avance

MISE À JOUR 1

STATUT: RÉSOLU

Modifications

<FlatList data={data}
              numColumns={1}
              keyExtractor={(item, index) => index.toString()}
              extraData={this.state}
              ItemSeparatorComponent={FlatListItemSeparator}
              renderItem={({item, index}) => {
                return(
                <View >
                <Text >{Object.keys(item)}</Text>
                <FlatList data={item[Object.keys(item)]}
                numColumns={5}
                keyExtractor={(index) => "D"+index.toString()}
                extraData={this.state}
                renderItem={({item, index}) => {
                  return(
                        <TouchableOpacity onPress={() => this._handleclick(index, item)} style={[
                            styles.Buttoncolor, this.state.selected == index+item.label
                              ? styles.onfocusbutton
                              : null
                          ]}>
                          <Text style={[styles.textcolor,this.state.selected == index+item.label?styles.white:null]}>{item.label}</Text>
                        </TouchableOpacity>
                        )
                }
                }/>
              </View>)}}/>

dans le rendu Flatlist

data =   [
      {Color:[{'label':'BLUE','value':'10'}, {'label':'RED','value':'11'}]},
      {Size:[{'label':'SMALL','value':'13'},{'label':'BIG','value':'12'}]}
      ]


0 commentaires

3 Réponses :


1
votes

vous pouvez essayer un tableau au lieu de stocker un seul élément sélectionné,

rendre l'état sélectionné comme un tableau vide lorsque vous déclarez.

_handleclick = (index, item) => {
        let selectedIndex = this.state.selected.indexOf(index+item.label);
        if(selectedIndex== -1){
          this.setState({selected: [...this.state.selected,index+item.label], selectedColor: item.value})
        }

      }

voici votre méthode de gestion, push nouvel élément sélectionné dans le tableau sélectionné

...
<TouchableOpacity onPress={() => this._handleclick(index, item)} style={[
                            styles.Buttoncolor, this.state.selected.indexOf(index+item.label) != -1
                              ? styles.onfocusbutton
                              : null
]}>
    <Text style={[styles.textcolor, this.state.selected.indexOf(index+item.label) != -1?styles.white:null]}>{item.label}</Text>
</TouchableOpacity>


4 commentaires

il sélectionne toute la valeur du tableau et ne peut même pas obtenir dans la condition précédente.et je veux en sélectionner un seul dans la couleur et une dans la taille, comment puis-je le faire


alors vous devez séparer sélectionné pour les deux, comme selectedColor et selectedSize. supprimer le tableau aussi.


Je ne peux pas le faire comme ça, votre approche est juste de prendre les valeurs sélectionnées dans le tableau, ce que je veux, mais une seule valeur par tableau


merci mec, j'ai fait mon travail en utilisant votre solution, vous pouvez vérifier mon message quels changements j'ai apportés au travail ...



1
votes

Le problème vient probablement des attributions d'arguments de fonction. Si vous voyez les deux méthodes renderItem dans Flatlist utilise renderItem = {({item, index}) donc le dernier renderItem code > peut accéder à l'élément , index ci-dessus. Il y a une confusion lorsque onPress appelé, quel élément ou index mettre dans le rappel. Veuillez essayer d'ajouter les différents noms d'argument. Comme

<FlatList data={data}
   numColumns={1}
   keyExtractor={(item, index) => index.toString()}
   extraData={this.state}
   ItemSeparatorComponent={FlatListItemSeparator}
   renderItem={({item, index}) => {
   return(
     <View >
     <Text >{Object.keys(item)}</Text>
     <FlatList data={item[Object.keys(item)]}
                numColumns={5}
                keyExtractor={(index) => "D"+index.toString()}
                extraData={this.state}
                renderItem={({set, key}) => {
                  return(
                        <TouchableOpacity onPress={() => this._handleclick(key, set)} style={[
                            styles.Buttoncolor, this.state.selected == index+item.label
                              ? styles.onfocusbutton
                              : null
                          ]}>
                          <Text style={[styles.textcolor,this.state.selected == index+item.label?styles.white:null]}>{item.label}</Text>
                        </TouchableOpacity>
                        )
                }
                }/>
              </View>)}}/>

Faites-moi savoir si cela résout votre problème. Bon codage. :)


3 commentaires

non ce n'est pas ... ça donne une erreur que set.label n'est pas une fonction et lisez d'abord la question ce que je veux faire merci ..


@Tanveerbyn chill bro, avec cette attitude, vous ne serez pas beaucoup aidé.


Ce n'est pas grave, mais soyez toujours poli, surtout si quelqu'un prend son temps pour vous aider.



1
votes

Si j'ai bien compris, vous devez sélectionner une seule option pour chaque propriété (couleurs et tailles). Vous devez donc avoir un champ dans votre état pour chaque élément que vous souhaitez enregistrer.

Votre fonction _handleClick pourrait être quelque chose comme ceci:

<TouchableOpacity
  onPress={() => this._handleclick(index, item)}
  style={[
    styles.Buttoncolor,
    this.state.selectedSize == index + item.label ||
    this.state.selectedColor == index + item.label
      ? styles.onfocusbutton
      : null,
  ]}>
  <Text
    style={[
      styles.textcolor,
      this.state.selectedSize == index + item.label ||
      this.state.selectedColor == index + item.label
        ? styles.white
        : null,
    ]}>
    {item.label}
  </Text>
</TouchableOpacity>

Chaque fois que vous cliquez sur un élément, vous devez savoir s'il s'agit d'une couleur ou d'une taille, puis mettre à jour correctement le bon champ. Ce n'est peut-être pas la méthode la plus performante, mais cela fonctionne.

Ensuite, dans votre méthode de rendu, pour attribuer un style, vous pouvez vérifier les deux conditions:

_handleclick = (index, item) => {
  const { Color } = this.state.data[0];
  const { Size } = this.state.data[1];
  this.setState(state => ({
    selectedColor: Color.find(color => color.label === item.label)
      ? index + item.label
      : state.selectedColor,
    selectedSize: Size.find(size => size.label === item.label)
      ? index + item.label
      : state.selectedSize,
  }));
};

J'ai essayé de reproduire votre question dans cette collation , vous pouvez prendre un regardez.


1 commentaires

sry mais j'ai besoin de le faire de manière dynamique «Couleur» c'est une approche fixe que j'ai fait précédemment, je dois le faire sur du contenu dynamique, c'est pourquoi .. et je veux que toutes les valeurs sélectionnées dans un tableau btw que pour votre réponse. .