みなさんこんにちは、個別指導塾コミット塾長、AWESOME開発担当の船津です。
第何回なのか忘れてきました。まぁ何回でもいいでしょ。
目次 [hide]
今回のバージョンのgithubリポジトリ
二回目ではタップしたタスクに斜線を引くように設定してみます。
参考にしたのはこちらの2つ
公式サイト
http://redux.js.org/docs/basics/ExampleTodoList.html
この方の記事のわかりやすさったら…しゅごい
http://qiita.com/xkumiyu/items/e7e1e8ed6a5d6a6e20dd
今回作るもの
今回は前回のまでの機能に少し手を加えていきます。
変更点のみ記述していきます。
それでは作っていきましょう。
と、その前に、
storeがグローバルになっているのでこのように変更しておきましょう。
containers/app/js
1 | let store = createStore(reducer) |
containers/TodoApp.js
- mapDispatchToPropsを使ってactionをまとめます
- アクションそれぞれに関数を割り当てます
- TodoListに対して関数を渡します。
- submitTaskはテキスト入力後に呼び出されます
- onTodoClickはタスクの文字列を押すと呼び出されます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import { toggleTodo } from '../actions/index' ; export default class TodoApp extends Component { render() { const { todos, submitTask, onTodoClick } = this .props; return ( <TodoList todos={todos} submitTask={submitTask} onTodoClick={onTodoClick} /> ) } } function mapStateToProps(state) { return { todos: state.todos } } function mapDispatchToProps(dispatch) { return { submitTask: (text) => { dispatch(addTodo(text)) }, onTodoClick: (id) => { dispatch(toggleTodo(id)) } } } export default connect( mapStateToProps, mapDispatchToProps, )(TodoApp) |
components/TodoList.js
– テキスト入力をするとタスクが追加されます。
– Todoコンポーネントに対してcompletedを渡しています。
– 文字列を押した際にタスクを特定するためにTodoコンポーネントに対して(todo.id)の形でIDを渡しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | render() { const { todos, submitTask, onTodoClick} = this .props; return ( <View style={styles.container}> <View> <TextInput style={styles.input} placeholder={ 'tasks?' } placeholderTextColor={ "rgba(198,198,204,1)" } onChangeText={(text) => { this .setState({text})}} onSubmitEditing={() => { submitTask( this .state.text) console.log(todos) this .setState({text: '' }) }} value={( this .state && this .state.text) || '' } /> {todos.map((todo) => <Todo key={todo.id} text={todo.text} completed={todo.completed} {...todo} onPress={() => onTodoClick(todo.id)} /> )} </View> </View> ) } |
components/Todo.js
– completedがtrueの場合のみ、打ち消し線が入るようになっています。三項演算子ですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | render(){ const { text, completed, onPress } = this .props return ( <View> <TouchableHighlight onPress={onPress} activeOpacity={75 / 100} underlayColor={ "rgb(210,210,210)" }> <Text style={ completed ? styles.completed : '' }>{text}</Text> </TouchableHighlight> </View> ) } const styles = StyleSheet.create({ completed: { textDecorationLine: 'line-through' , textDecorationStyle: 'solid' , } }) |
ここまで出来たらこんな画面になります。
頑張って作ってみてくださいね。
おしまい
次回は完了したタスクを見えないようにしていきます。
次回もがんばるぞい!