SlideShare a Scribd company logo
1 of 46
Download to read offline
Vue.js 3.0で搭載される
Composition APIをざっくりと



湧上 雄一郎

● VueComposition APIとは
● Composition APIのメリット
● 保守性の向上とは
● 再利用性の向上とは
● Vue Composition APIの設計
● まとめ
● 課題
アジェンダ

Vue Composition API

Vue Composition API

● Vue Composition APIはVue 3で導入される予定のVueの新しいAPI
● @vue/composition-apiを追加することで、Vue2系でも使用できる
Vue Composition API

● Vue Composition APIはVue 3で導入される予定のVueの新しいAPI
● @vue/composition-apiを追加することで、Vue2系でも使用できる
公式の紹介によると
「コンポーネントのロジックの柔軟なコンポジションを可能にする関数ベース
のAPI」
Vue Composition API

● Vue Composition APIはVue 3で導入される予定のVueの新しいAPI
● @vue/composition-apiを追加することで、Vue2系でも使用できる
公式の紹介によると
「コンポーネントのロジックの柔軟なコンポジションを可能にする関数ベース
のAPI」
ざっくりいうと
Vue Composition API

● Vue Composition APIはVue 3で導入される予定のVueの新しいAPI
● @vue/composition-apiを追加することで、Vue2系でも使用できる
公式の紹介によると
「コンポーネントのロジックの柔軟なコンポジションを可能にする関数ベース
のAPI」
ざっくりいうと
Vue Composition APIとは
Vue Composition API

● Vue Composition APIはVue 3で導入される予定のVueの新しいAPI
● @vue/composition-apiを追加することで、Vue2系でも使用できる
公式の紹介によると
「コンポーネントのロジックの柔軟なコンポジションを可能にする関数ベース
のAPI」
ざっくりいうと
従来と比べてより柔軟にコンポーネントを書く方法
Vue Composition APIとは
<script>
export default {
props: {
times: {type: Number,default: 2}
},
data() {
return {
count: 0
}
},
methods: {
increment() {
this.count += 1
}
}
}
</script>
これまでのやり方

<script>
export default {
props: {
times: {type: Number,default: 2}
},
data() {
return {
count: 0
}
},
methods: {
increment() {
this.count += 1
}
}
}
</script>
<script>
import { ref } from '@vue/composition-api'
export default {
props: {
times: {type: Number,default: 2}
},
setup() {
let count = ref(0)
const increment = () => {
count.value += 1
}
return {count,increment}
}
}
</script>
これまでのやり方
 Composition API

<script>
export default {
props: {
times: {type: Number,default: 2}
},
data() {
return {
count: 0
}
},
methods: {
increment() {
this.count += 1
}
}
}
</script>
<script>
import { ref } from '@vue/composition-api'
export default {
props: {
times: {type: Number,default: 2}
},
setup() {
let count = ref(0)
const increment = () => {
count.value += 1
}
return {count,increment}
}
}
</script>
これまでのやり方
 Composition API

<script>
export default {
props: {
times: {type: Number,default: 2}
},
data() {
return {
count: 0
}
},
methods: {
increment() {
this.count += 1
}
}
}
</script>
<script>
import { ref } from '@vue/composition-api'
export default {
props: {
times: {type: Number,default: 2}
},
setup() {
let count = ref(0)
const increment = () => {
count.value += 1
}
return {count,increment}
}
}
</script>
これまでのやり方
 Composition API

<script>
export default {
props: {
times: {type: Number,default: 2}
},
data() {
return {
count: 0
}
},
methods: {
increment() {
this.count += 1
}
}
}
</script>
<script>
import { ref } from '@vue/composition-api'
export default {
props: {
times: {type: Number,default: 2}
},
setup() {
let count = ref(0)
const increment = () => {
count.value += 1
}
return {count,increment}
}
}
</script>
これまでのやり方
 Composition API

<script>
export default {
props: {
times: {type: Number,default: 2}
},
data() {
return {
count: 0
}
},
methods: {
increment() {
this.count += 1
}
}
}
</script>
<script>
import { ref } from '@vue/composition-api'
export default {
props: {
times: {type: Number,default: 2}
},
setup() {
let count = ref(0)
const increment = () => {
count.value += 1
}
return {count,increment}
}
}
</script>
これまでのやり方
 Composition API

<script>
export default {
props: {
times: {type: Number,default: 2}
},
data() {
return {
count: 0
}
},
methods: {
increment() {
this.count += 1
}
}
}
</script>
<script>
import { ref } from '@vue/composition-api'
export default {
props: {
times: {type: Number,default: 2}
},
setup() {
let count = ref(0)
const increment = () => {
count.value += 1
}
return {count,increment}
}
}
</script>
これまでのやり方
 Composition API

Composition APIのメリット

Composition APIのメリット

CompositionAPI は柔軟にコンポーネントをかける
Composition APIのメリット

CompositionAPI は柔軟にコンポーネントをかける
Composition APIのメリット

CompositionAPI は柔軟にコンポーネントをかける
● メリット① : 保守性の向上
Composition APIのメリット

CompositionAPI は柔軟にコンポーネントをかける
● メリット① : 保守性の向上
● メリット② : 再利用性の向上 
保守性の向上とは

保守性の向上 =
保守性の向上とは

保守性の向上 = コードが見やすい、わかりやすい
保守性の向上とは

保守性の向上 = コードが見やすい、わかりやすい
保守性の向上とは

Vue 2
保守性の向上 = コードが見やすい、わかりやすい
保守性の向上とは

Vue 2
● ロジックがオプションごとに切り分けられる
● オプションベースではdataやmethodsなどオプションごとに関連する
データや処理が分散してしまう
● このような断片化は、複雑なコンポーネントの理解と保守を困難にする
保守性の向上 = コードが見やすい、わかりやすい
保守性の向上とは

Vue 2
● ロジックがオプションごとに切り分けられる
● オプションベースではdataやmethodsなどオプションごとに関連する
データや処理が分散してしまう
● このような断片化は、複雑なコンポーネントの理解と保守を困難にする
Composition API
保守性の向上 = コードが見やすい、わかりやすい
保守性の向上とは

Vue 2
● ロジックがオプションごとに切り分けられる
● オプションベースではdataやmethodsなどオプションごとに関連する
データや処理が分散してしまう
● このような断片化は、複雑なコンポーネントの理解と保守を困難にする
Composition API
● compositionAPIでは、柔軟にかけるので機能ごとにロジックを切り分け
られる
● ロジックが一つにまとまってるのでわかりやすい
<script>
export default {
data() {
return {
// Xのdata
// Yのdata
}
},
computed: {
// Yのcomputed
// Zのcomputed
},
methods: {
// Xのmethod
// Zのmethod
}
}
</script>
<script>
import { reactive, computed } from
'@vue/composition-api'
export default {
setup() {
// X機能
// Xのdeta
// Xのmethod
// Y機能
// Yのdata
// Yのcomputed
// Z機能
// Zのcomputed
// Zのmethod
return {X, Y, Z}
}
}
</script>
オプションベース
 Composition API

再利用性の向上とは

再利用性の向上 =
再利用性の向上とは

処理を切り分けて共通パーツ化しやすいか
(共通化したパーツをインポート)
再利用性の向上 =
再利用性の向上とは

Vue 2(mixinを使った場合の問題点)
処理を切り分けて共通パーツ化しやすいか
(共通化したパーツをインポート)
再利用性の向上 =
再利用性の向上とは

Vue 2(mixinを使った場合の問題点)
● コンポーネント側ではmxinの内容が把握しにくい
● コンポーネントや別のmixinでプロパティやメソッドの名前が競合す
る可能性がある
処理を切り分けて共通パーツ化しやすいか
(共通化したパーツをインポート)
<script>
import {mousePosition} from ‘../mixins/mousePosition’
export default {
mixins: [mousePosition],
data() { ~~},
methods: {~~}
}
</script>
export const mousePosition = {
data() { ~~},
methods: {~~}
}
}
mixins/mousePosition.js
components/CounterMouse.vue
<script>
import {mousePosition} from ‘../mixins/mousePosition’
export default {
mixins: [mousePosition],
data() { ~~},
methods: {~~}
}
</script>
export const mousePosition = {
data() { ~~},
methods: {~~}
}
}
mixins/mousePosition.js
components/CounterMouse.vue
<script>
import {mousePosition} from ‘../mixins/mousePosition’
export default {
mixins: [mousePosition],
data() { ~~},
methods: {~~}
}
</script>
export const mousePosition = {
data() { ~~},
methods: {~~}
}
}
mixins/mousePosition.js
components/CounterMouse.vue
<script>
import {mousePosition} from ‘../mixins/mousePosition’
export default {
mixins: [mousePosition],
data() { ~~},
methods: {~~}
}
</script>
export const mousePosition = {
data() { ~~},
methods: {~~}
}
}
mixins/mousePosition.js
components/CounterMouse.vue
このコンポーネントはmixinからどんな機能を
提供してもらっているのか推測できない
compositions/position.js
components/CounterMouse.vue
<script>
import { usePosition } from ‘../composition/position’
export default {
setup() {
const { position, updatePosition} = usePosition()
}
}
</script>
import {reactive} from ‘@vue/composition-api’
export const usePosition = () => {
const position = reactive({~~})
const updatePosition = () => {~~}
};
return { position, updatePosition }
}
compositions/position.js
components/CounterMouse.vue
<script>
import { usePosition } from ‘../composition/position’
export default {
setup() {
const { position, updatePosition} = usePosition()
}
}
</script>
import {reactive} from ‘@vue/composition-api’
export const usePosition = () => {
const position = reactive({~~})
const updatePosition = () => {~~}
};
return { position, updatePosition }
}
compositions/position.js
components/CounterMouse.vue
<script>
import { usePosition } from ‘../composition/position’
export default {
setup() {
const { position: mousePosition, updatePosition: updateMouse} = usePosition()
}
}
</script>
import {reactive} from ‘@vue/composition-api’
export const usePosition = () => {
const position = reactive({~~})
const updatePosition = () => {~~}
};
return { position, updatePosition }
}
compositions/position.js
components/CounterMouse.vue
<script>
import { usePosition } from ‘../composition/position’
export default {
setup() {
const { position: mousePosition, updatePosition: updateMouse} = usePosition()
}
}
</script>
import {reactive} from ‘@vue/composition-api’
export const usePosition = () => {
const position = reactive({~~})
const updatePosition = () => {~~}
};
return { position, updatePosition }
}
外部の関数からどのようなデータを貰ってるか
推測しやすい => 読みやすい
Vue Composition APIの設計

実際にアプリケーションに落とし込むには
Vue Composition APIの設計

実際にアプリケーションに落とし込むには
● 機能ごとに処理をわけれるということは、関数にして共通化できる
● setup()関数は、主にすべての構成関数が呼び出されるエントリポイント
として主に機能させる
● setup内で生成したリアクティブな変数を渡すことで、状態を保つ
● 関数化で柔軟にコンポーネントを書くことができる
● ロジックをオプションベースではなく機能ベースで切り分ける
ことができる
● 保守性と再利用性の向上で読みやすいコードになる
まとめ

● 他と組み合わせたらどうなるか(TypeScript、AtomicDedign)
● 公式サイトをもっと読み込んで理解できるように
課題


More Related Content

Similar to Vue.js 3.0で搭載される Composition APIをざっくりと

iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13  第7回:ARTSAT API 実践 2 衛星の情報で表現するiTamabi 13  第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現するAtsushi Tadokoro
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Toshiro Shimizu
 
iTamabi 13  第6回:ARTSAT API 実践 1 Web APIから情報を取得する
iTamabi 13  第6回:ARTSAT API 実践 1 Web APIから情報を取得するiTamabi 13  第6回:ARTSAT API 実践 1 Web APIから情報を取得する
iTamabi 13  第6回:ARTSAT API 実践 1 Web APIから情報を取得するAtsushi Tadokoro
 
Roslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドインRoslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドインFujio Kojima
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Goyaegashi
 
Grunt front-osaka-1-lt-tanaka
Grunt front-osaka-1-lt-tanakaGrunt front-osaka-1-lt-tanaka
Grunt front-osaka-1-lt-tanakaHisateru Tanaka
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Yoshifumi Kawai
 
Android Architecture Componentsの新機能
Android Architecture Componentsの新機能Android Architecture Componentsの新機能
Android Architecture Componentsの新機能Damper Matsu
 
Titanium Mobile
Titanium MobileTitanium Mobile
Titanium MobileNaoya Ito
 
Android Lecture #04 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.Android Lecture #04 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.Yuki Higuchi
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンYoichiro Tanaka
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよkoji lin
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみたYuki Takei
 
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理土岐 孝平
 

Similar to Vue.js 3.0で搭載される Composition APIをざっくりと (20)

iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13  第7回:ARTSAT API 実践 2 衛星の情報で表現するiTamabi 13  第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0
 
iTamabi 13  第6回:ARTSAT API 実践 1 Web APIから情報を取得する
iTamabi 13  第6回:ARTSAT API 実践 1 Web APIから情報を取得するiTamabi 13  第6回:ARTSAT API 実践 1 Web APIから情報を取得する
iTamabi 13  第6回:ARTSAT API 実践 1 Web APIから情報を取得する
 
Roslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドインRoslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドイン
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Go
 
Grunt front-osaka-1-lt-tanaka
Grunt front-osaka-1-lt-tanakaGrunt front-osaka-1-lt-tanaka
Grunt front-osaka-1-lt-tanaka
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
Android Architecture Componentsの新機能
Android Architecture Componentsの新機能Android Architecture Componentsの新機能
Android Architecture Componentsの新機能
 
Titanium Mobile
Titanium MobileTitanium Mobile
Titanium Mobile
 
Android Lecture #04 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.Android Lecture #04 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.
 
20200304 vuejs
20200304 vuejs20200304 vuejs
20200304 vuejs
 
Vue入門
Vue入門Vue入門
Vue入門
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターン
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよ
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
 
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
 

Vue.js 3.0で搭載される Composition APIをざっくりと