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
vuedrink
June 10, 2019
Programming
1
730
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
580
Other Decks in Programming
See All in Programming
OSS開発者という働き方
andpad
5
1.7k
testingを眺める
matumoto
1
140
旅行プランAIエージェント開発の裏側
ippo012
2
900
Updates on MLS on Ruby (and maybe more)
sylph01
1
180
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
120
プロポーザル駆動学習 / Proposal-Driven Learning
mackey0225
2
1.3k
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
320
意外と簡単!?フロントエンドでパスキー認証を実現する WebAuthn
teamlab
PRO
2
740
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
430
CJK and Unicode From a PHP Committer
youkidearitai
PRO
0
110
アルテニア コンサル/ITエンジニア向け 採用ピッチ資料
altenir
0
100
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
350
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
173
14k
Designing for Performance
lara
610
69k
The Invisible Side of Design
smashingmag
301
51k
Typedesign – Prime Four
hannesfritz
42
2.8k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
The Power of CSS Pseudo Elements
geoffreycrofte
77
6k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.5k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
580
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
Git: the NoSQL Database
bkeepers
PRO
431
66k
GraphQLとの向き合い方2022年版
quramy
49
14k
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