Upload
masahiro-kyuden
View
1.073
Download
0
Embed Size (px)
Citation preview
https://github.com/Kyuden/one-night-vue
環境構築
CloneしてREADME.mdを読んでね
haml/demo1.haml ! %body #demo1 %p{"v-text" => "message"} %input{"v-model" => "message"}
coffee/demo1.coffee!new Vue el: "#demo1" data: message: "Hello Vue"
haml/demo1.haml ! %body #demo1 %p{"v-text" => "message"} %input{"v-model" => "message"}
coffee/demo1.coffee!new Vue el: "#demo1" data: message: "Hello Vue"
以下の初期値をVueクラスのコンストラクタに渡し ViewModelを作成している
el: "#demo1"data: message: "Hello Vue"
haml/demo1.haml ! %body #demo1 %p{"v-text" => "message"} %input{"v-model" => "message"}
coffee/demo1.coffee!new Vue el: "#demo1" data: message: "Hello Vue"
haml/demo1.haml ! %body #demo1 %p{"v-text" => "message"} %input{"v-model" => "message"}
coffee/demo1.coffee!new Vue el: "#demo1" data: message: "Hello Vue"
s #demo1のDOMを指定している
#demo1のDOMがViewModelを紐づく
haml/demo1.haml ! %body #demo1 %p{"v-text" => "message"} %input{"v-model" => "message"}
coffee/demo1.coffee!new Vue el: "#demo2" data: message: "Hello Vue"
s #demo1を#demo2に変更すると ViewModelの管理外となるので動作しない
haml/demo1.haml ! %body #demo1 %p{"v-text" => "message"} %input{"v-model" => "message"}
coffee/demo1.coffee!new Vue el: "#demo1" data: message: "Hello Vue"
haml/demo1.haml ! %body #demo1 %p{"v-text" => "message"} %input{"v-model" => "message"}
coffee/demo1.coffee!new Vue el: "#demo1" data: message: "Hello Vue"
data配下にmessageプロパティとして 初期値 ‘’Hello Vue’’ を定義している
haml/demo1.haml ! %body #demo1 %p{"v-text" => "message"} %input{"v-model" => "message"}
coffee/demo1.coffee!new Vue el: "#demo1" data: message: "Hello Vue"
haml/demo1.haml ! %body #demo1 %p{"v-text" => "message"} %input{"v-model" => "message"}
coffe/demo1.coffee!new Vue el: "#demo1" data: message: "Hello Vue"
messageプロパティ値"Hello Vue”が %pタグ内にバインディングされる
haml/demo1.haml ! %body #demo1 %p{"v-text" => "message"} %input{"v-model" => "message"}
coffee/demo1.coffee!new Vue el: "#demo1" data: message: "Hello Vue"
v-model%inputや%selectや%textareaなど編集可能な要素を使用し
ViewとViewModle間で双方向データバインディングを行う
データは常に同期される(同期のタイミングを指定するオプションも存在する)
haml/demo1.haml ! %body #demo1 %p{"v-text" => "message"} %input{"v-model" => "message"}
coffe/demo1.coffee!new Vue el: "#demo1" data: message: "Hello Vue"
%input要素への入力値に応じて messageプロパティ値を同期させる
%input要素への入力値に応じて messageプロパティ値が更新される
2 staps1. ブラウザで表示
• www/demo2.html
2. コードから処理を推測 • coffee/demo2.coffee • haml/demo2.haml
以後省略(全Stage同じです)
haml/demo2.haml !#demo2 %p {{ 'hello' + ' ' + user.firstName + ' ' + user.lastName }}
coffee/demo2.coffee!new Vue el: "#demo2" data: user: firstName: "Masahiro" lastName: "kyuden"
haml/demo2.haml !#demo2 %p {{ 'hello' + ' ' + user.firstName + ' ' + user.lastName }}
coffee/demo2.coffee!new Vue el: "#demo2" data: user: firstName: "Masahiro" lastName: "kyuden"
%p{"v-text" => "'hello ' + user.firstName + ' ' + user.lastName"}
haml/demo3.haml !#demo3 %ul /step① %li{"v-repeat" => "todos"} {{content}}
coffee/demo3.coffee!new Vue el: '#demo3' data: todos: [ { done: true content: 'Learn JS' } { done: false content: 'Learn vue.js' } { done: true content: 'Lean yourself' } ]
haml/demo3.haml !#demo3 %ul /step① %li{"v-repeat" => "todos"} {{content}}
coffee/demo3.coffee!new Vue el: '#demo3' data: todos: [ { done: true content: 'Learn JS' } { done: false content: 'Learn vue.js' } { done: true content: 'Lean yourself' } ]
配列であるtodosを与えると要素数分作成される。
haml/demo3.haml !#demo3 %ul /step② %li{class: "{{done ? 'done' : ''}}", "v-repeat" => "todos"} {{content}}
coffee/demo3.coffee!new Vue el: '#demo3' data: todos: [ { done: true content: 'Learn JS' } { done: false content: 'Learn vue.js' } { done: true content: 'Lean yourself' } ]
sass/style.sass!li.done text-decoration: line-through
{{ }}MustacheのBindingはHTML属性指定でも有効
ただし%imgのsrc指定はv-attrを使用するべき。
ブラウザ評価時にMustache形式のままHTTPリクエストを発行し404が起きるため
haml/demo3.haml !#demo3 %ul /step③ %li{class: "{{done ? 'done' : ''}}", "v-repeat" => "todos", "v-on" => "click: done = !done"} {{content}}
coffee/demo3.coffee!new Vue el: '#demo3' data: todos: [ { done: true content: 'Learn JS' } { done: false content: 'Learn vue.js' } { done: true content: 'Lean yourself' } ]
haml/demo3.haml !#demo3 %ul /step③ %li{class: "{{done ? 'done' : ''}}", "v-repeat" => "todos", "v-on" => "click: done = !done"} {{content}}
coffee/demo3.coffee!new Vue el: '#demo3' data: todos: [ { done: true content: 'Learn JS' } { done: false content: 'Learn vue.js' } { done: true content: 'Lean yourself' } ]
clickされた時に を評価するdone = !done
haml/demo4.haml !#demo4 %ul %li{class: "{{done ? 'done' : ''}}", "v-repeat" => "todos", "v-on" => "click: done = !done"} /step① {{content | uppercase}}
coffee/demo4.coffee!new Vue el: '#demo4' data: todos: [ { done: true content: 'Learn JS' } { done: false content: 'Learn vue.js' } { done: true content: 'Lean yourself' } ]
haml/demo4.haml !#demo4 %ul %li{class: "{{done ? 'done' : ''}}", "v-repeat" => "todos", "v-on" => "click: done = !done"} /step① {{content | uppercase}}
coffee/demo4.coffee!new Vue el: '#demo4' data: todos: [ { done: true content: 'Learn JS' } { done: false content: 'Learn vue.js' } { done: true content: 'Lean yourself' } ]
Contentに対しuppercaseフィルターを通しバインディングを行う
haml/demo4.haml !#demo4 %ul %li{class: "{{done ? 'done' : ''}}", "v-repeat" => "todos", "v-on" => "click: done = !done"} /step② {{content | uppercase | lowercase}}
coffee/demo4.coffee!new Vue el: '#demo4' data: todos: [ { done: true content: 'Learn JS' } { done: false content: 'Learn vue.js' } { done: true content: 'Lean yourself' } ]
復数のフィルターを掛ける事ができる
haml/demo5.haml !#demo5 %p {{displayName}} %input{ "v-model" => "newName", "v-on" => "keyup:addName | key enter"}
coffee/demo5.coffee !new Vue el: '#demo5' data: nameList: [] displayName: "" newName: "" methods: addName: -> @displayName = @newName @newName = ""
haml/demo5.haml !#demo5 %p {{displayName}} %input{ "v-model" => "newName", "v-on" => "keyup:addName | key enter"}
coffee/demo5.coffee !new Vue el: '#demo5' data: nameList: [] displayName: "" newName: "" methods: addName: -> @displayName = @newName @newName = ""
methodのコンテキストはViewModel のインスタンスになる
v-onではkeyイベントをフィルターで 制御することができる
参考文献• http://vuejs.org/guide/ • http://todomvc.com/examples/vue/