前提・実現したいこと
React Nativeを利用してアプリの開発をしています。
Stateで配列([])を管理する際の、要素の追加と削除の方法を知りたいです。
const [name, setName] = useState([]);
と宣言した場合、
setName
を使って、追加、削除したほうが良いと思うのですが、どのようにすればよいかわかりません。
例えば、
const [name, setName] = useState([""]);
というように初期値を設定してから、
setName(name.push(""));
と行うと、配列の要素が増えずになぜか「2」が値として入ります。
方法をご存知の方おりましたら、ご教授いただけないでしょうか?
今質問の背景
もともと、連想配列でテキストの入力を含むコンポーネントの追加、削除を行う予定でした。
しかし、下記の画像のような削除の仕方をしたい時に、通常の配列([])を利用したほうが、コードを作りやすいと思い現在改良をしています。
該当のソースコード
連想配列を利用した場合のコード
JS
1import React, { useState } from "react"; 2import { View, Button, Text, TextInput } from "react-native"; 3 4function Item({ setText, handleAdd, i }) { 5 return ( 6 <View> 7 <TextInput 8 style={{ borderWidth: 1 }} 9 onChange={(e) => { 10 setText(i, e.nativeEvent.text); 11 }} 12 ></TextInput> 13 <Button 14 title="追加" 15 onPress={() => { 16 handleAdd(); 17 }} 18 ></Button> 19 </View> 20 ); 21} 22 23export default function TestStateArray() { 24 const [count, setCount] = useState(1); 25 const [name, setName] = useState({}); 26 27 function handleAdd() { 28 setCount((v) => v + 1); 29 } 30 return ( 31 <View> 32 <Text>確認{JSON.stringify(name)}</Text> 33 {Array.from({ length: count }, (_, i) => ( 34 <Item 35 handleAdd={handleAdd} 36 setText={(i, text) => setName((prev) => ({ ...prev, [i]: text }))} 37 key={i} 38 i={i} 39 /> 40 ))} 41 </View> 42 ); 43} 44
通常の配列でのコード
JS
1import React, { useState, useEffect } from "react"; 2import { View, Text, Button, TextInput } from "react-native"; 3 4function Item({ setName, handleAdd, handleDelete, index }) { 5 return ( 6 <View> 7 <TextInput 8 style={{ borderWidth: 1 }} 9 onChange={(e) => { 10 setName(e.nativeEvent.text); 11 }} 12 ></TextInput> 13 <Button 14 title="追加" 15 onPress={() => { 16 handleAdd(); 17 }} 18 /> 19 <Button 20 title="削除" 21 onPress={() => { 22 handleDelete(index); 23 }} 24 /> 25 </View> 26 ); 27} 28 29export default function TestStateArray() { 30 const [count, setCount] = useState(1); 31 const [name, setName] = useState([""]); 32 33 function handleAdd() { 34 setCount((v) => v + 1); 35 setName(name.push("")); 36 } 37 function handleDelete(index) { 38 setCount((v) => v - 1); 39 setName(name.splice(index, 1)); 40 } 41 console.log(name); 42 return ( 43 <View> 44 <Text>確認{JSON.stringify(name)}</Text> 45 46 {Array.from({ length: count }, (_, i) => ( 47 <Item 48 name={name} 49 setName={setName} 50 handleAdd={handleAdd} 51 handleDelete={handleDelete} 52 key={i} 53 index={i} 54 /> 55 ))} 56 </View> 57 ); 58}
補足情報(FW/ツールのバージョンなど)
node : 12.18.3
react native : 4.10.1
expo : 3.22.3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/10 10:55