配列の特定の箇所をsetAttributesで変更保存したいです。。
react
1const sampleInputChange = (newValue) => { 2 setAttributes({ 3 sample_labels: newValue 4 }) 5} 6return ( 7 <> 8 {items.map((item) => ( 9 <div key={item.sample_id}> 10 <div className="input_area"> 11 <TextControl 12 className="input_sample_id" 13 name="sample_id" 14 type="hidden" 15 value={item.sample_id} 16 onChange={(newValue) => sampleInputChange(newValue)} 17 /> 18 <TextControl 19 className="input_sample_labels" 20 name="sample_labels" 21 value={item.sample_labels} 22 data-control={item.sample_id} 23 onChange={(newValue) => sampleInputChange(newValue)} 24 /> 25 <TextControl 26 className="input_sample_data" 27 name="sample_data" 28 type="number" 29 value={item.sample_data} 30 data-control={item.sample_id} 31 onChange={(sample_data) => sampleInputChange(sample_data)} 32 /> 33 </div> 34 </div> 35 ))} 36 </> 37);
itemsはconsole.logで表示するとこのような配列になっています
(3)[{… }, {… }, {… }] 0: { sample_id: 0, sample_labels: 'English', sample_data: 300 } 1: { sample_id: 1, sample_labels: 'Spanish', sample_data: 50 } 2: { sample_id: 2, sample_labels: 'French', sample_data: 50 }
items.mapで表示させつつ変更があった値をAttributesで保存したいです。
お心優しい方アドバイスいただきたいです
sampleInputChange には引数として items 配列のどの要素かを表す id または index と、変更する値のキー (sample_id:, sample_labels, sample_data のどれか) が必要だと思います。
そして、sample_id がユーザー入力可能ってことは、値が重複したらどうするか考える必要がありますね。
ありがとうございます。
配列のどの要素かをdata-controlで渡せるとしてら、どの様に変更可能でしょうか?
説明不足で申し訳ないですが、sample_idはユーザー入力可能ではない値です。
items の内容を直接更新するなら、data-control とかは使わずに、sampleInputChange を
const sampleInputChange = (id, key, newValue) => {
setAttributes(items.map(item => (item.sample_id === id ? { ...item, [key]: newValue } : item)));
}
として、TextControl の onChange で必要な値を渡せば良いかと。
また、sample_id は TextControl で編集可能になってるように見えますが…。
あと、もしかして setAttributes は items を更新するのではなく、変更内容を別途保存する感じでしょうか?
ありがとうございます。
なるほど試してみます。
> あと、もしかして setAttributes は items を更新するのではなく、変更内容を別途保存する感じでしょうか?
こちら、そうです。
表示する値と保存する値は少し違っていてデータを
```
const sampleArr = [];
for (var i = 0; i < sample_id.length; i++) {
sampleArr.push({ sample_id: sample_id[i], sample_labels: sample_labels[i], sample_data: sample_data[i] });
};
const [items, setState] = useState(sampleArr);
```
として
sampleInputChangeで
```
let addValue = { sample_id: sample_id, sample_labels: sample_labels, sample_data: sample_data }
setState([...items, addValue]);
```
を使ったら行けるかなと思っていましたがもっと良い書き方ありますでしょうか
うーん、ちょっと何がしたいのか分からないですね…。
情報不足ですみません
質問を作り直したのでもし可能でしたらアドバイス頂きたいです。。
https://teratail.com/questions/359236?modal=q-comp
hoshi-takanoriさん
何度もスミマセン
>items の内容を直接更新するなら、data-control とかは使わずに、sampleInputChange を
const sampleInputChange = (id, key, newValue) => {
setAttributes(items.map(item => (item.sample_id === id ? { ...item, [key]: newValue } : item)));
}
として、TextControl の onChange で必要な値を渡せば良いかと。
こちらはonChangeイベントで複数の値を渡すのはどの様にすればよいのでしょうか?
教えていただければ幸いです。
例えば sample_labels に対しては
onChange={(newValue) => sampleInputChange(item.sample_id, 'sample_labels', newValue)}
って感じですね。
hoshi-takanoriさん
ありがとうございます
onChangeイベントで複数の値を渡すことはできたのですが以前お答えいただいたsetAttributesの中で特定の配列を変更することができないです
setAttributes(items.map(item => (item.sample_id === id ? { ...item, [key]: newValue } : item)));
item.sample_id === id が一致するものを[key]: newValueとして変更している気がするのですがなぜでしょうか?
教えていただければ幸いです
お願いします