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
Vuejs Composition Function の概要
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
vuedrink
June 10, 2019
Programming
1
750
Vuejs Composition Function の概要
By Kaoru Hosakawa
From AppSocially KK
At Vue.js Tokyo Drinkup
#vuedrink
vuedrink
June 10, 2019
Tweet
Share
More Decks by vuedrink
See All by vuedrink
Publishing Vue Components to NPM
vuedrink
1
590
Other Decks in Programming
See All in Programming
Amazon Bedrockを活用したRAGの品質管理パイプライン構築
tosuri13
4
700
並行開発のためのコードレビュー
miyukiw
0
160
CSC307 Lecture 03
javiergs
PRO
1
490
AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話
azukiazusa1
1
730
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.4k
カスタマーサクセス業務を変革したヘルススコアの実現と学び
_hummer0724
0
700
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
110
「ブロックテーマでは再現できない」は本当か?
inc2734
0
1k
Oxlint JS plugins
kazupon
1
950
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
650
組織で育むオブザーバビリティ
ryota_hnk
0
180
なぜSQLはAIぽく見えるのか/why does SQL look AI like
florets1
0
460
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
A Tale of Four Properties
chriscoyier
162
24k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
What's in a price? How to price your products and services
michaelherold
247
13k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
65
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.3k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
1
53
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
270
Practical Orchestrator
shlominoach
191
11k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.9k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
0
2.3k
Why Our Code Smells
bkeepers
PRO
340
58k
Transcript
7VFKT$PNQPTJUJPO'VODUJPOͷ֓ཁ LBPSVIPTPLBXB!DIBUDFOUFSJP "QQ4PDJBMMZגࣜձࣾ
ಈػ
ϩδοΫͷΈཱͯ w 7VFYͰɺίϯϙʔωϯτϕʔεͷ"1*Λ༻͍ͯɺϩδοΫΛΧϓηϧԽ͍ͯ͠Δɻ NJYJOTɺߴ֊ίϯϙʔωϯτɺSFOEFSMFTTίϯϙʔωϯτͳͲͷύλʔϯ͕ଘࡏ͢Δ ͕ɺͦΕͧΕ͕ܽ͋Δɻ w QSPQFSUZͷग़Ͳ͜Ζ͕ෆ໌֬ɺྫ͑ɺͲͷNJYJO͔Βདྷ͍ͯΔͷ͔Θ͔ΓͮΒ͍ w OBNFTQBDFͷিಥɺNJYJOͷϝιου໊ w
ύϑΥʔϚϯεɺߴ֊ίϯϙʔωϯτSFOEFSMFTTίϯϙʔωϯτɺՃͷίϯ ϙʔωϯτ͕ඞཁ w ͦΕʹରͯ͠ɺؔϕʔεͷ"1*ɺ͜ΕΒͷ͕ܽͳ͍ɻϩδοΫΛநग़͠ɺ ʮDPNQPTJUJPOGVODUJPOʯʹ·ͱΊɺϦΞΫςΟϒͳঢ়ଶΛ͢Α͏ʹ͍ͯ͠Δɻ
&YBNQMF function useMouse() { const x = value(0) const y
= value(0) const update = e => { x.value = e.pageX y.value = e.pageY } onMounted(() => { window.addEventListener('mousemove', update) }) onUnmounted(() => { window.removeEventListener('mousemove', update) }) return { x, y } } // in consuming component const Component = { setup() { const { x, y } = useMouse() const { z } = useOtherLogic() return { x, y, z } }, template: `<div>{{ x }} {{ y }} {{ z }}</div>` }
ͦͷଞ w ܕਪ w ͷΰʔϧɿΑΓྑ͍5ZQF4DSJQUܕਪͷαϙʔτ w όϯυϧαΠζ w ؔ"1*ɺ໊લ͖&4FYQPSUTͰΤΩεϙʔτ͞ΕɺΦϯσϚϯυ ͰΠϯϙʔτ͞ΕΔͷͰɺσουίʔυআڈʢUSFFTIBLFʣՄೳ
w ؔ"1*Ϋϥε"1*ΑΓѹॖ͕ߴ͍
ৄࡉ
TFUVQؔ w ίϯϙʔωϯτͷઃఆΛߦ͏ؔ w QSPQTͷ͕ղܾ͠ɺίϯϙʔω ϯτͷΠϯελϯε͕ੜ͞Εͨ ޙɺݺͼग़͞ΕΔ w QSPQTϦΞΫςΟϒ const
MyComponent = { props: { name: String }, setup(props) { console.log(props.name) } }
4UBUF w TFUVQؔɺEBUB ͷΑ͏ʹ UFNQMBUFඳը༻ʹΦϒδΣΫτΛ ฦ͢͜ͱ͕Մೳ w WBMVFXSBQQFSΛͬͯɺTFUVQ ؔͰɺͷมߋ͕ՄೳͳϦΞ ΫςΟϒมΛ࡞Ͱ͖Δʢྫɿ
NTHʣ import { value } from 'vue' const MyComponent = { setup(props) { const msg = value('hello') const appendName = () => { msg.value = `hello ${props.name}` } return { msg, appendName } }, template: `<div @click="appendName">{{ msg }}</div>` }
7BMVF8SBQQFS w +BWB4DSJQUͷϓϦϛςΟϒʢɺจࣈྻͳͲʣɺ͠ɻΑͬͯɺ ؔͷΓ͕มߋͯ͠ߋ৽͞ΕͨΛऔಘ͢Δ͜ͱ͕Ͱ͖ͳ͍ɻ w 7BMVFXSBQQFSΛ͏͜ͱʹΑͬͯҙͷܕΛ࣋ͭΛࢀর͢͠Δ͜ ͱ͕Ͱ͖ΔɻΓɺϦΞΫςΟϒʹͳΓৗʹ࠷৽ʹΛऔಘ͢Δ͜ͱ ͕Մೳɻ
7BMVF6OXSBQQJOH w แ·ΕͨɺSFOEFSίϯςΩ ετϦΞΫςΟϒͳΦϒδΣ ΫτͷೖΕࢠϓϩύςΟ ʢྫɿDPVOUʣͰɺแ͕ղ ͔ΕɺWBMVFͳ͠ͰΞΫηε͢ Δ͜ͱ͕Ͱ͖Δɻ const count
= value(0) const obj = state({ count }) console.log(obj.count) // 0 obj.count++ console.log(obj.count) // 1 console.log(count.value) // 1 count.value++ console.log(obj.count) // 2 console.log(count.value) // 2
$PNQVUFE7BMVFT w $PNQVUFEWBMVFYDPNQVUFE QSPQFSUZͷΑ͏ʹɺґଘ͍ͯ͠Δ Λࢹ͠ɺ͕มߋͨ࣌͠ͷΈ DPNQVUFEWBMVFͷ࠶ܭࢉ͕࣮ࢪ͞ ΕΔɻ w ॻ͖ࠐΈՄೳͳDPNQVUFEWBMVFΛ࡞ Δ߹ɺTFUUFSΛ༻ҙ͢Δɻ
const count = value(0) const writableComputed = computed( // read () => count.value + 1, // write val => { count.value = val - 1 } )
8BUDIFST w XBUDIΛͬͯϦΞΫςΟϒͳε ςʔτΛࢹ͠ɺ෭࡞༻Λى͜͢ ͜ͱ͕Մೳ w ୈ̍Ҿ͕ιʔεʢHFUUFSɺWBMVF ϥούʔɺྻʣɺୈ̎Ҿ͕ ίʔϧόοΫ const
MyComponent = { props: { id: number }, setup(props) { const data = value(null) watch(() => props.id, async (id) => { data.value = await fetchData(id) }) } }
-JGFDZDMF)PPLT w શͯͷMJGFDZDMFIPPLTʹରԠ ͢ΔPO999͕ؔ༻ҙ͞ΕΔ import { onMounted, onUpdated, onUnmounted }
from 'vue' const MyComponent = { setup() { onMounted(() => { console.log('mounted!') }) onUpdated(() => { console.log('updated!') }) onUnmounted(() => { console.log('unmounted!') }) } }
%FQFOEFODZ*OKFDUJPO w ίϯϙʔωϯτ͕QSPWJEF ͨ͠Λมߋͨ࣌͠ɺࢠίϯ ϙʔωϯτߋ৽͕ߦΘΕΔ import { provide, inject }
from 'vue' const CountSymbol = Symbol() const Ancestor = { setup() { // providing a value can make it reactive const count = value(0) provide({ [CountSymbol]: count }) } } const Descendent = { setup() { const count = inject(CountSymbol) return { count } } }
ܽ w ίϯϙʔωϯτఆٛͷϦϑϨΫγϣϯ͓Αͼૢ࡞͕͘͠ͳͬͨ w ͔͠͠ɺϦϑϨΫγϣϯૢ࡞੬͍͠ϦεΩʔͳͷͰٯʹྑ͍͜ͱͳͷ͔͠Εͳ͍ɻؔ "1*ͰΧόʔͰ͖Δͱߟ͍͑ͯΔɻ w ίϯϙʔωϯτΛPQUJPOHSPVQ͝ͱʹ·ͱΊΔඞཁ͕ͳ͍ͨΊɺεύήοςΟίʔυΛॿ͢ Δ w
ίϯϙʔωϯτͷPQUJPOΛ͏ͱཧ͞Ε͍ͯΔΑ͏ʹݟ͑Δ͕ɺϩδοΫ֤PQUJPOʹ ࢄ͞Ε͍ͯΔɻྫ͑ɺσʔλΛऔಘ͢ΔʹɺQSPQTɺEBUB ɺNPVOUFEɺXBUDI͕ඞཁɻ w ؔ"1*ͷ߹ɺҰͭͷؔʹϩδοΫΛ·ͱΊΔ͜ͱ͕Ͱ͖ΔɻڊେͳTFUVQ͕ؔͰ͖ͨ ࣌ɺෳͷؔʹղ͢ΕΑ͍ɻ
ࢀরจݙ rfcs/active-rfcs/0000-function-api