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

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

44
September 19, 2018

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

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