Upgrade to Pro — share decks privately, control downloads, hide ads and more …

React(Kotlin)でToDoアプリを作ってみた

Avatar for 44 44
September 19, 2018

 React(Kotlin)でToDoアプリを作ってみた

Avatar for 44

44

September 19, 2018
Tweet

More Decks by 44

Other Decks in Technology

Transcript

  1. コンストラクタ プライマリコンストラクタはクラスヘッダ部分に書きます class Person constructor(val firstName: String) { ... }

    アノテーションやアクセス修飾子がない場合はconstructorキーワードを省略できます class Person(val firstName: String) { ... }
  2. 引数の最後にラムダを渡す時の省略記法 fun hoge(s: String, func: (String) -> Unit) 引数の最後のラムダは括弧の外側に書くことができます。 hoge(“Hoge”,

    { s -> println(s) }) hoge(“Hoge”) { s -> println(s) } 引数がラムダだけの場合、丸括弧を省略することができます。 fun fuga(func: (String) -> Unit) fuga { s -> println(s) }
  3. main(JavaScript) import './css/index.css' import React from 'react' import ReactDOM from

    'react-dom' import App from './App' ReactDOM.render(<App />, document.getElementById('root'))
  4. render(JavaScript) class App extends Component { constructor() { … }

    render() { return ( <div className="app"> <h1>todoアプリを作ってみた</h1> <TodoList todos={this.state.todos} /> </div> ); } }
  5. render(Kotlin) class App : RComponent<RProps, AppState>() { override fun AppState.init()

    { ... } override fun RBuilder.render() { div( classes = "app" ) { h1 { +"todoアプリを作ってみた" } todoList(state.todoList) } } }
  6. List Rendering(JavaScript) class TodoList extends Component { render() { const

    todos = this.props.todos.map( todo => <Todo key={todo.id} {...todo} /> ) return( <ul> {todos} </ul> ); } }
  7. List Rendering(Kotlin) class TodoListComponent(props: TodoListProps): RComponent<TodoListProps, TodoListState>(props) { override fun

    TodoListState.init(props: TodoListProps) { todoList = props.todoList.toMutableList() } override fun RBuilder.render() { val todos = props.todoList.map { todo(it, props.setTodoStatus) } ul { todos } } }
  8. State(JavaScript) class App extends Component { constructor() { super() this.state

    = { todos: [ { id: 1, title: "Hello, React!", desc: "React始めました", done: false }, ... ] } } render() { ... } }
  9. State(Kotlin) interface AppState: RState { var todoList: MutableList<Todo> var countTodo:

    Int } class App : RComponent<RProps, AppState>() { override fun AppState.init() { todoList = mutableListOf( Todo(1, "Hello, React!", "React始めました"), Todo(2, "Hello, Redux!", "Reduxも始めました") ) } override fun RBuilder.render() { ... } }
  10. Props(JavaScript) class Todo extends Component { render() { const className

    = 'undone' const link = this.props.done ? '元に戻す' : '完了!' return( <li className={className}> <span>{this.props.id}</span> <span>:{this.props.title}  </span> <a href="">{link}</a> <p>{this.props.desc}</p> </li> ); } }
  11. Props(Kotlin) interface TodoProps: RProps { var todo: Todo var setTodoStatus:

    (Todo) -> Unit } class TodoComponent(props: TodoProps): RComponent<TodoProps, RState>(props) { override fun RBuilder.render() { val className = if(props.todo.done) "undone" else "done" val link = if(props.todo.done) "元に戻す" else "完了!" ... } } fun RBuilder.todo(todo: Todo) = child(TodoComponent::class) { attrs.todo = todo }
  12. Handling Event(JavaScript) class Todo extends Component { render() { ...

    return( ... <a href="" onClick={(e) => { e.preventDefault(); this.props.setTodoStatus(this.props)}}>{link}</a>   ... ); } }
  13. Handling Event(Kotlin) class TodoComponent(props: TodoProps): RComponent<TodoProps, RState>(props) { override fun

    RBuilder.render() { ... a(href = "#") { +link attrs { onClickFunction = { e -> e.preventDefault() [email protected]([email protected]) } } } ... } } }
  14. まとめ • 無理やり感はなく、普段のReactのように書ける • Kotlinのモダンな言語仕様を利用してフロントが書ける • TypeSafeにフロントをかけるのは良い (TypeScriptでいいのでは?) • サーバーサイドもフロントもAndroidも同じ言語で書ける

    • KotlinでReactが書けるってことはKotlinでReact Nativeも…!? JetBrains/kotlin-wrappers https://github.com/JetBrains/kotlin-wrappers Kotlin JS OverView https://kotlinlang.org/docs/reference/js-overview.html