Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Vue.jsでコンポーネント入門!ハンズオン勉強会
Search
naokie
July 05, 2016
Technology
320
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Vue.jsでコンポーネント入門!ハンズオン勉強会
https://itstaffing.connpass.com/event/34159/
Vue.jsでコンポーネント入門!ハンズオン勉強会
naokie
July 05, 2016
More Decks by naokie
See All by naokie
あと3年フロントエンドでやる力
naokie
1
1.2k
Other Decks in Technology
See All in Technology
千葉での単身赴任からAWSをやり続け、千葉に戻ってきた話
yama3133
1
120
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
150
FPC(フレキシブル)基板にZephyr実装してみた。
iotengineer22
0
160
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
530
AIが自律的に回る開発ループを設計してチーム開発に組み込む
nekorush14
0
120
從開發到部署全都交給 AI:實作 AI 驅動的自動化流程
appleboy
0
150
不要なレビューをAIにまかせて AIコーディングの環境改善を加速した
shoota
1
260
「ビジネスがわかるエンジニア」とは何か?
ryooob
0
280
WebGIS AI Agentの紹介
_shimizu
0
550
MUSUBI 田中裕一『AIと共に行う「しごとのリデザイン」- スモールバックオフィス編』AI Ops Lab #4
musubi
0
310
AIのReact習熟度を測る
uhyo
2
680
スタートアップにAmazon EKSは早すぎる? マルチプロダクト戦略を加速する Platform Engineeringの実践 / Is Amazon EKS Too Soon for Startups? Practical Platform Engineering to Accelerate a Multi-Product Strategy
elmodev09
1
1.7k
Featured
See All Featured
The Mindset for Success: Future Career Progression
greggifford
PRO
0
370
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
390
Design in an AI World
tapps
1
250
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Six Lessons from altMBA
skipperchong
29
4.3k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
310
Context Engineering - Making Every Token Count
addyosmani
9
980
Technical Leadership for Architectural Decision Making
baasie
3
420
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
WENDY [Excerpt]
tessaabrams
11
38k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
580
Transcript
Vue.jsͰίϯϙʔωϯτೖʂϋϯ ζΦϯษڧձ 2016/07/05(Tue) @DeNA
Web Components ͱʁ
Web ͷ࠶ར༻Մೳͳύʔπ࡞ͷ༷
࠶ར༻ՄೳͳύʔπΛߟ͑Δ্ͰͷΈ • HTML, CSS, JavaScript 3ͭͷઐ༻ݴޠͰߏɻ • HTML ͷෳࡶͳೖΕࢠߏ •
CSS ͷҙਤ͠ͳ͍ద༻ൣғ • JavaScript ͷDOMߏͷґଘ
ߏ͢ΔϦιʔε 1. Custom Elements Ϣʔβʔ͕ಠࣗͷΧελϜཁૉΛఆٛ 2. HTML Imports அยԽͨ͠HTMLϑΝΠϧΛϩʔυ 3.
HTML Template ϒϥβωΠςΟϒͳςϯϓϨʔτػೳ 4. Shadow DOM HTMLʹείʔϓΛܗ
ར༻ͷϝϦοτ • ϚʔΫΞοϓ͕εοΩϦ • ελΠϧͷద༻ൣғΛߜΓࠐΉ • ෳࡶͳߏΛ֎෦͔Βݟ͑ͳ͘͢Δ
ϒϥβͷରԠঢ়گ1
ϒϥβͷରԠঢ়گ2 • Google ओಋͰϒϥβϕϯμͷฒΈόϥόϥ • Polyfill Ͱ࣮࣮͕ͱͯগͳ͍ • Polymer, X-Tag
ͳͲͷϥΠϒϥϦͰ… • ։ൃ͔Β4ͰͦΖͦΖʁ • Vue.js ͳΒ…
Vue.js ͱ Web Components
Vue.js ͷ2ͭͷॏཁͳίϯηϓτ • ϦΞΫςΟϒσʔλόΠϯσΟϯά • ίϯϙʔωϯτγεςϜ
Vue.js ͷίϯϙʔωϯτγεςϜ Custom Elements ͷ༷ʹԊͬͨߏจΛ࣮
ྫ͑… • slot ཁૉ h(ps:/ /www.w3.org/TR/shadow-dom/#slots • is ଐੑ h(ps:/
/www.w3.org/TR/custom-elements/#a(r-is
େنΞϓϦέʔγϣϯྫ1
େنΞϓϦέʔγϣϯྫ2 <div id="app"> <app-nav></app-nav> <app-view> <app-sidebar></app-sidebar> <app-content></app-content> </app-view> </div>
ίϯϙʔωϯτͷ࡞ΛͬͯΈΑ͏
Codepen Ͱ࡞͍͖ͯ͠·͢ɻ ҎԼͷ Pen Λ Fork ͯ͠͡Ί͍ͯͩ͘͞ɻ hands-on-vuejs-vol2-0 - h0p:/
/codepen.io/naokie/pen/rLwLyd
్தܦաΛؒҧͬͯফͯ͠͠·Θͳ͍Α͏ʹɺ Fork ͢Δͱ͖ʹ Loginɺ·ͨ Save as Anonymous ͠·͢ɻ
Vol.1 Ռ
Vol.1 ςϯϓϨʔτ <div id="my-app"> <!-- ৽نλεΫͷՃ --> <p> NewTask: <input
type="text" v-model="newTask" /> <button v-on:click="addTodo">Add</button> </p> <hr /> <!-- λεΫͷϦετදࣔ --> <ul> <li v-for="todo in todos"> <input type="checkbox" v-model="todo.isCompleted" /> <span v-bind:class="{ 'complete': todo.isCompleted }">{{ todo.task }}</span> <button v-on:click="deleteTodo(todo)">Delete</button> </li> </ul> <!-- ΓλεΫͷΧϯτදࣔ --> <p>Remaining Tasks: {{ remains }}/{{ todos.length }}</p> </div>
Vol.1 Vue Πϯελϯε var vm = new Vue({ el: '#my-app',
// Ϛϯτ͢Δཁૉ data: { // ϓϩΩγ͢Δͯ͢ͷϓϩύςΟ newTask: '', todos: [ { task: 'ڇೕΛങ͏', isCompleted: false }, { task: 'ϓϩςΠϯΛങ͏', isCompleted: true }, { task: 'εϙʔπυϦϯΫΛങ͏', isCompleted: false } ] }, computed: { // ࢉग़ϓϩύςΟ remains: function() { var inCompleteList = this.todos.filter(function(task) { return !task.isCompleted; }); return inCompleteList.length; } }, methods: { // Πϯελϯεϝιου addTodo: function() { if (this.newTask == '') return; this.todos.push( { task: this.newTask, isCompleted: false } ); this.newTask = ''; }, deleteTodo: function(todo) { this.todos.$remove(todo); } } });
࠶ར༻Մೳͳ୯Ґʁ 1. ಉ͡ϖʔδͰ܁Γฦ͠දࣔ͢ΔʢϦετදࣔʣ 2. αΠτͰ܁Γฦ͠ར༻͢ΔʢΟδΣοτදࣔʣ
ࠓճ࡞͢Δίϯϙʔωϯτ • Todo ίϯϙʔωϯτͷ࡞ • App ίϯϙʔωϯτͷ࡞
Todo ίϯϙʔωϯτ λεΫ1ͭΛߏ͍ͯ͠ΔύʔπΛίϯϙʔωϯτԽ
HTML Template ΛΓग़͠ <script type="text/template" id="t_todo"> <li> <input type="checkbox" v-model="todo.isCompleted"
/> <span v-bind:class="{ 'complete': todo.isCompleted }">{{ todo.task }}</span> <button v-on:click="deleteTodo(todo)">Delete</button> </li> </script>
Γग़ͨ͠ՕॴΛΧελϜཁૉͰஔ͖͑ <ul> <todo v-for="todo in todos" :todo="todo"></todo> </ul>
είʔϓ • ίϯϙʔωϯτΠϯελϯε֤ࣗʹείʔϓΛ͍࣋ͬͯΔ • ࢠίϯϙʔωϯτσʔλΛࢀরͰ͖ͳ͍
Props σʔλΛࢠίϯϙʔωϯτʹୡ͢ΔΦϓγϣϯ • 2ͭͷम০ࢠ • .sync: two-way όΠϯσΟϯά • .once:
one--me όΠϯσΟϯά • ݕূཁ݅ΛઃఆՄೳ
ίϯϙʔωϯτͷ࡞ var Todo = Vue.extend({ template: '#t_todo', props: { 'todo':
{ required: true } } });
ίϯϙʔωϯτΛొ var vm = new Vue({ ... components: { Todo:
Todo } });
ಈ࡞ͷ֬ೝ • νΣοΫϚʔΫͷ͚֎͠ • ৽نλεΫͷొ • λεΫͷআ • ΓλεΫͷΧϯτදࣔ
λεΫͷআ <button v-on:click="deleteTodo(todo)">Delete</button>
σʔλૢ࡞ͷͱΠϕϯτ • ࡞ͨ͠ Todo ίϯϙʔωϯτͷϝιουͰͳ͍ • λεΫϦετίϯϙʔωϯτ͕อ͍࣋ͯ͠Δ • λεΫϦετͷૢ࡞ίϯϙʔωϯτͷ •
ࢠίϯϙʔωϯτΠϕϯτͷΈ௨ • ࢠؒͰͷΠϕϯτཧ͕ඞཁʹ
ΧελϜΠϕϯτ ίϯϙʔωϯτؒͷΠϕϯτ௨৴ͷΈ • $on() Λ༻ͯ͠ΠϕϯτΛϦοεϯ͠·͢ • $emit() Λ༻ͯࣗ͠ͷΠϕϯτΛτϦΨʔ͠·͢ • $dispatch()
Λ༻ͯ͠ํʹΠϕϯτΛૹग़͠·͢ • $broadcast() Λ༻ͯ͠ࢠଙํʹΠϕϯτΛग़͠·͢
Todo ίϯϙʔωϯτ͔ΒΠϕϯτΛૹग़ var Todo = Vue.extend({ ... methods: { deleteTodo:
function(todo) { this.$dispatch('delete', todo); } } });
ͰΠϕϯτΛϦοεϯ var vm = new Vue({ ... events: { 'delete':
function(todo) { this.todos.$remove(todo); } } });
͜͜·ͰͷՌ hands-on-vuejs-vol2-1 - h0p:/ /codepen.io/naokie/pen/qNjNAw
App ίϯϙʔωϯτ খ͞ͳΞϓϦʢΟδΣοτʣΛίϯϙʔωϯτԽ
HTML Template ΛΓग़͠ <script type="text/template" id="t_app"> <!-- divཁૉͰғΉ --> <div>
<p> NewTask: <input type="text" v-model="newTask" /> <button v-on:click="addTodo">Add</button> </p> <hr /> <ul> <todo v-for="todo in todos" :todo="todo"></todo> </ul> <p>Remaining Tasks: {{ remains }}/{{ todos.length }}</p> </div> </script>
ϑϥάϝϯτΠϯελϯε • ςϯϓϨʔτͷίϯςϯπɺΧελϜཁૉΛஔ͖͑Δ • ςϯϓϨʔτ୯ҰͷϧʔτཁૉΛ࣋ͭͷ͕ਪ
Γग़ͨ͠ՕॴΛΧελϜཁૉͰஔ͖͑ <app :todos="todos"></app>
ίϯϙʔωϯτͷ࡞ var App = Vue.extend({ template: '#t_app', props: { 'todos':
{ required: true } }, ... components: { Todo: Todo } });
ίϯϙʔωϯτΛొ var vm = new Vue({ ... components: { App:
App } });
ಈ࡞ͷ֬ೝ • νΣοΫϚʔΫͷ͚֎͠ • ৽نλεΫͷొ • λεΫͷআ • ΓλεΫͷΧϯτදࣔ
৽نλεΫͷొ <button v-on:click="addTodo">Add</button>
App ίϯϙʔωϯτ͔ΒΠϕϯτΛૹग़ var App = Vue.extend({ // ίϯϙʔωϯτఆٛͰॳظσʔλΦϒδΣΫτΛฦؔ͢ͱͯ͠એݴ͢Δ data: function()
{ return { newTask: '', }; }, ... methods: { addTodo: function() { if (this.newTask == '') return; this.$dispatch('add', this.newTask); this.newTask = ''; } } });
ͰΠϕϯτΛϦοεϯ var vm = new Vue({ ... events: { ...
'add': function(newTask) { this.todos.push( { task: newTask, isCompleted: false } ); } } });
ΓλεΫͷΧϯτදࣔ var App = Vue.extend({ ... computed: { remains: function()
{ var inCompleteList = this.todos.filter(function(task) { return !task.isCompleted; }); return inCompleteList.length; } }, ... });
࠶ར༻Մೳͳύʔπͷ <div id="my-app"> <app :todos="todos"></app> <app :todos="todos"></app> <app :todos="todos"></app> </div>
͜͜·ͰͷՌ hands-on-vuejs-vol2-2 - h/p:/ /codepen.io/naokie/pen/oLwLAj
One more thing...
App ίϯϙʔωϯτ͝ͱʹݟग़͠ΛՃ
εϩοτ • ίϯϙʔωϯτ༻ऀ͕ίϯςϯπΛՃ͢ΔΈ • είʔϓͰίϯϙʔωϯτʹίϯςϯπΛՃ • ໊લ͖ͭεϩοτͰෳ࣋ͭ͜ͱՄೳ
ςϯϓϨʔτʹ slot ཁૉΛՃ <script type="text/template" id="t_app"> <div> <slot></slot> ... </div>
</script>
App ίϯϙʔωϯτ༻ՕॴͰݟग़͠ΛՃ <div id="my-app"> <app :todos="todos"> <h1>ϝΠϯ</h1> </app> <app :todos="todos">
<h1>αϒ</h1> </app> <app :todos="todos"></app> </div>
͜͜·ͰͷՌ hands-on-vuejs-vol2-3 - h0p:/ /codepen.io/naokie/pen/NAgRWY
ͬͯΈΑ͏ NewTask ίϯϙʔωϯτ
ςϯϓϨʔτ <script type="text/template" id="t_newtask"> <p> NewTask: <input type="text" v-model="newTask" />
<button v-on:click="addTodo">Add</button> </p> </script>
ίϯϙʔωϯτԽ var NewTask = Vue.extend({ template: '#t_newtask', data: function() {
return { newTask: '', }; }, methods: { addTodo: function() { if (this.newTask == '') return; this.$dispatch('add', this.newTask) this.newTask = ''; } } });
ίϯϙʔωϯτͷొ var App = Vue.extend({ ... components: { Todo: Todo,
NewTask: NewTask } });
͜͜·ͰͷՌ hands-on-vuejs-vol2-4 - h0p:/ /codepen.io/naokie/pen/BzkLyJ
ࠓճͷ͓Έ͛ GitHub - h*ps:/ /github.com/naokie/hands-on-vuejs-vol2 Codepen - h*p:/ /codepen.io/collec1on/DoLeNM/