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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
CSC307 Lecture 09
javiergs
PRO
1
840
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
170
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.6k
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
1
130
AIエージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
5
460
なぜSQLはAIぽく見えるのか/why does SQL look AI like
florets1
0
460
LLM Observabilityによる 対話型音声AIアプリケーションの安定運用
gekko0114
2
430
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
610
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
380
Fluid Templating in TYPO3 14
s2b
0
130
Rust 製のコードエディタ “Zed” を使ってみた
nearme_tech
PRO
0
180
Featured
See All Featured
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
270
Ruling the World: When Life Gets Gamed
codingconduct
0
140
Ethics towards AI in product and experience design
skipperchong
2
190
What does AI have to do with Human Rights?
axbom
PRO
0
2k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
330
Everyday Curiosity
cassininazir
0
130
The agentic SEO stack - context over prompts
schlessera
0
640
YesSQL, Process and Tooling at Scale
rocio
174
15k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.4k
Chasing Engaging Ingredients in Design
codingconduct
0
110
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
110
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
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