動的なキー名を持つReactjs setState()?


248

編集:これは複製です、ここを参照してください

状態を設定するときに動的キー名を使用する例は見つかりません。これは私がしたいことです:

inputChangeHandler : function (event) {
    this.setState( { event.target.id  : event.target.value } );
},

event.target.idは、更新される状態キーとして使用されます。これはReactでは不可能ですか?


4
これは、動的オブジェクトキーに関する質問の複製です。具体的な反応はありません
コリーダニエルソン

9
var newstate = {}; newstate [event.target.id] = event.target.id; this.setState(newstate);
Cory Danielson

ありがとう、私はオブジェクトを一般的に使用するのが苦手でした。
trad


@trad私はこの問題を抱えていますが、最初の状態に何を付けましたか?関係ないですよね?
Raphael Onofre

回答:


280

@Coryのヒントのおかげで、私はこれを使用しました:

inputChangeHandler : function (event) {
    var stateObject = function() {
      returnObj = {};
      returnObj[this.target.id] = this.target.value;
         return returnObj;
    }.bind(event)();

    this.setState( stateObject );    
},

ES6またはBabelトランスパイラーを使用してJSXコードを変換する場合は、計算されたプロパティ名でもこれを実行できます。

inputChangeHandler : function (event) {
    this.setState({ [event.target.id]: event.target.value });
    // alternatively using template strings for strings
    // this.setState({ [`key${event.target.id}`]: event.target.value });
}

27
コードをビルドするためにbablejsを使用している場合は、このための新しい構文もあります。使用できますcomputed property names
Cory Danielson、2015年

2番目の方法では、Windows(IE、Chrome)のブラウザーで構文エラーが発生します。誰か気づいた?
ベンジャミンズ2015

記載する方法?
Muneem Habib 2016

おかげでtrad、これは<Radio />実装のためのコードの重複を避けるために私が探していたものです。
Adesh M 2017

6
次のように計算されたプロパティ名を使用して状態を設定した場合this.setState({ [event.target.id]: event.target.value });、どのように使用してその状態にアクセスしthis.state......ますか?
user3574492 2017年

142

複数の制御された入力要素を処理する必要がある場合、各要素に名前属性を追加して、ハンドラー関数にevent.target.nameの値に基づいて実行する処理を選択させることができます。

例えば:

inputChangeHandler(event) {
  this.setState({ [event.target.name]: event.target.value });
}


7
[event.target.name]を囲む角括弧は何を示していますか?なぜそれらが必要なのですか?
user798719 2018

1
this.setState({userName:e.target.value});のように各要素に個別に名前を付ける通常のアプローチと比較します。これは、フォームの複数の要素を配列として処理し、個々の要素を設定する必要はありません
vikram jeet sing

1
しかし、それでも私は同じようにその状態にどのようにアクセスしますか?好きthis.state([event.target.name])
Kirankumar Dafda

1
私が思うにMDNのWebドキュメントをし、この記事では、我々は、ブラケットを必要とする理由を説明します。
Kelli

46

私がこれを達成した方法...

inputChangeHandler: function(event) {
  var key = event.target.id
  var val = event.target.value
  var obj  = {}
  obj[key] = val
  this.setState(obj)
},

私は同様の方法で行いましたが、問題はまだコンポーネントがレンダリングされず、投稿するためにpillarを実行し(これを含む:D)、どこかでこれが見つかりましたthis.forceUpdate();。後で問題を見てみましょう!!
xploreraj 2018

24

追加したいのは、解体を使用してコードをリファクタリングし、見栄えをよくすることもできることです。

inputChangeHandler: function ({ target: { id, value }) {
    this.setState({ [id]: value });
},

10

次の.mapような作業をループします。

{
    dataForm.map(({ id, placeholder, type }) => {
        return <Input
            value={this.state.type}
            onChangeText={(text) => this.setState({ [type]: text })}
            placeholder={placeholder}
            key={id} />
    })
}

[]in typeパラメータに注意してください。お役に立てれば :)


10

同様の問題がありました。

2番目のレベルのキーが変数に格納されている場所の状態を設定したいと思いました。

例えば this.setState({permissions[perm.code]: e.target.checked})

ただし、これは有効な構文ではありません。

これを実現するために、次のコードを使用しました。

this.setState({
  permissions: {
    ...this.state.permissions,
    [perm.code]: e.target.checked
  }
});


2

私はきれいでシンプルな解決策を探していました、そして私はこれを見つけました:

this.setState({ [`image${i}`]: image })

お役に立てれば


1
this.setState({ [`${event.target.id}`]: event.target.value}, () => {
      console.log("State updated: ", JSON.stringify(this.state[event.target.id]));
    });

引用文字を気にしてください。


0

辞書付きの状態は、他の値を失うことなくいくつかのキーを更新します

state = 
{   
    name:"mjpatel"  
    parsedFilter:
    {
      page:2,
      perPage:4,
      totalPages: 50,
    }
}

解決策は以下です

 let { parsedFilter } = this.state
 this.setState({
      parsedFilter: {
        ...this.state.parsedFilter,
        page: 5
      }
  });

ここで、キー「ページ」の値を値5に更新します


-4

次のようなスプレッド構文を使用できます。

inputChangeHandler : function (event) {
    this.setState( { 
        ...this.state,
        [event.target.id]: event.target.value
    } );
},

7
Reactがオブジェクトのマージを行いますが、これは悪い習慣です。
ローマー2017年

1
基本的に、内部オブジェクトがあり、その内部オブジェクトのプロパティを1つ変更する場合は、this.setState({selectedItems:{... selectedItems、[item.id]:true}})
Eran Or
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.