みなさんこんにちは、個別指導塾コミット塾長、AWESOME開発担当の船津です。
第何回なのか忘れてきました。まぁ何回でもいいでしょ。
目次
今回のバージョンのgithubリポジトリ
二回目ではタップしたタスクに斜線を引くように設定してみます。
参考にしたのはこちらの2つ
公式サイト
http://redux.js.org/docs/basics/ExampleTodoList.html
この方の記事のわかりやすさったら…しゅごい
http://qiita.com/xkumiyu/items/e7e1e8ed6a5d6a6e20dd
今回作るもの
今回は前回のまでの機能に少し手を加えていきます。
変更点のみ記述していきます。
それでは作っていきましょう。
と、その前に、
storeがグローバルになっているのでこのように変更しておきましょう。
containers/app/js
let store = createStore(reducer)
containers/TodoApp.js
- mapDispatchToPropsを使ってactionをまとめます
- アクションそれぞれに関数を割り当てます
- TodoListに対して関数を渡します。
- submitTaskはテキスト入力後に呼び出されます
- onTodoClickはタスクの文字列を押すと呼び出されます
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を渡しています。
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の場合のみ、打ち消し線が入るようになっています。三項演算子ですね。
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', } })
ここまで出来たらこんな画面になります。
頑張って作ってみてくださいね。
おしまい
次回は完了したタスクを見えないようにしていきます。
次回もがんばるぞい!