前提・実現したいこと
React Nativeを利用してアプリの開発をしています。
下記の3つの要素が1組となるコンポーネントがあります。
各コンポーネントは配列で管理され、それぞれのTextInputで入力された値は、コンポーネントと同じindexで管理する配列で、追加、削除の管理がされます。
- TextInput
- Button(追加)
- Button(削除)
追加ボタンを押すと、コンポーネントが追加され、削除を押すと削除されます。
発生している問題・エラーメッセージ
コンポーネントの追加、削除は問題なく機能するのですが、それぞれのTextInputの欄で、テキストを入力する際に動作がおかしくなります。
症状は、1文字入力すると、カーソルが入力欄から消えてしまい、次の文字を入力するには、再度カーソルを当て直す必要があり、通常のように連続して入力ができません。
なお、入力されたテキストは、配列の値として保持されます。
こちらの症状の解決の方法について、ご存知の方おりましたら、ご教授いただけないでしょうか?
該当のソースコード
JS
1import React, { useState } from "react"; 2import { View, Text, Button, TextInput, StyleSheet } from "react-native"; 3 4function Item({ number, handleInput, handleAdd, handleDelete, index }) { 5 return ( 6 <View style={styles.list}> 7 <Text>{index}</Text> 8 <TextInput 9 style={{ borderWidth: 1 }} 10 value={number[index]} 11 onChange={(e) => { 12 handleInput(index, e.nativeEvent.text); 13 }} 14 ></TextInput> 15 <Button 16 title="追加" 17 onPress={() => { 18 handleAdd(); 19 }} 20 /> 21 <Button 22 title="削除" 23 onPress={() => { 24 handleDelete(index); 25 }} 26 /> 27 </View> 28 ); 29} 30 31export default function TestStateArray() { 32 const [count, setCount] = useState(1); 33 const [number, setNumber] = useState([]); 34 35 function handleAdd() { 36 setCount((v) => v + 1); 37 } 38 39 function handleDelete(index) { 40 setCount((v) => v - 1); 41 setNumber((v) => { 42 const ret = v.slice(); 43 ret.splice(index, 1); 44 return ret; 45 }); 46 } 47 48 function handleInput(index, text) { 49 setNumber((v) => { 50 const ret = v.slice(); 51 ret[index] = text; 52 return ret; 53 }); 54 } 55 56 return ( 57 <View> 58 {Array.from({ length: count }, (_, i) => ( 59 <Item 60 number={number} 61 handleInput={handleInput} 62 handleAdd={handleAdd} 63 handleDelete={handleDelete} 64 key={i + "-" + number} 65 index={i} 66 /> 67 ))} 68 </View> 69 ); 70} 71 72const styles = StyleSheet.create({ 73 list: { 74 margin: 10, 75 padding: 10, 76 backgroundColor: "#ddd", 77 }, 78}); 79
補足情報(FW/ツールのバージョンなど)
node : 12.18.3
react native : 4.10.1
expo : 3.22.3
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。