質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

Q&A

1回答

1666閲覧

【React Native】TextInputの内容(value)をstateに入れる

da_

総合スコア9

React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

0グッド

0クリップ

投稿2020/06/03 07:45

質問事項

React / React Native初心者です。
Todoアプリを作っております。

<TextInput>で入力した内容をstateで保持したいのですが、
onChangeTextイベントでthis setState...とするとシミュレーター側で文字入力ができなくなります。
onChangeTextイベントでステートを触らなければ文字入力は通常通りできますが、入力されたテキストを保持できません。
どのようにしたらよろしいでしょうか。


↓下にコードを載せてます。

補足

UpdateItemの中で

this.setState({ item: text, });

を試みておりますが、文字入力できない状態になっています。

state{item}に入力されたテキストを保持し、その後AddTodo
追加のtodoタイトルとして表示させたいと思っています。

export default class TodoInstructions extends React.Component { constructor() { const todos = []; super(); this.state = { todos: todos, item: '', }; this.checkTodo = this.checkTodo.bind(this); this.deleteTodo = this.deleteTodo.bind(this); this.updateItem = this.updateItem.bind(this); this.addTodo = this.addTodo.bind(this); } checkTodo(todo) { const todos = this.state.todos.map((todo) => { return {id: todo.id, title: todo.title, isDone: todo.isDone}; }); const pos = this.state.todos .map((todo) => { return todo.id; }) .indexOf(todo.id); todos[pos].isDone = !todos[pos].isDone; this.setState({ todos: todos, }); } updateItem = (text) => { console.log(text); this.setState({ item: text, }); }; addTodo(text) { this.setState({ item: text, }); console.log(this.state.item); const getUniqueId = () => { return ( new Date().getTime().toString(36) + '-' + Math.random().toString(36) ); }; const item = { id: getUniqueId(), title: this.state.item, isDone: false, }; const todos = this.state.todos.slice(); todos.push(item); this.setState({ todos: todos, item: '', }); } deleteTodo(todo) { const todos = this.state.todos.slice(); console.log(todos); const pos = this.state.todos.indexOf(todo); todos.splice(pos, 1); this.setState({ todos: todos, item: '', }); } render() { function TodoForm(props) { return ( <View style={styles.formContainer}> <TextInput style={styles.form} onChangeText={(text) => props.updateItem(text)} clearButtonMode="while-editing" /> <View style={styles.addButton}> <Button title="Add" onPress={(text) => props.addTodo(text)} color={TodoColors.white} /> </View> </View> ); } function TodoList(props) { const todos = props.todos.map((todo) => { return ( <View> <TodoItem key={todo.id} todo={todo} checkTodo={props.checkTodo} deleteTodo={props.deleteTodo} /> </View> ); }); return <View style={styles.list}>{todos}</View>; } return ( <View style={styles.container}> <View style={styles.sectionContainer}> <TodoForm item={this.state.item} updateItem={this.updateItem} addTodo={this.addTodo} /> {this.state.todos.length ? ( <TodoList todos={this.state.todos} checkTodo={this.checkTodo} deleteTodo={this.deleteTodo} /> ) : ( <Text style={styles.nothing}>nothing to do!</Text> )} </View> </View> ); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

そもそもTextInputにvalueを渡していないのでは?

javascript

1this.state={ 2 text:"", 3}

javascript

1changeText = (text) => { 2 this.setState({ 3 text:text 4 }); 5}

javascript

1<TextInput 2 value={this.state.text} 3 onChangeText={this.changeText} 4>

投稿2020/07/31 03:04

Hogeike

総合スコア293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問