Slide 1

Slide 1 text

,JLVP೥݄೔ #VFGZͷ.BJOUBJOFSΛҾ͖ܧ͍ͩ݅ ࠓߋͳ͕Β7VFˠ΁ͷ৐Γ׵͑ۤ࿑࿩

Slide 2

Slide 2 text

ࣗݾ঺հ ,JLVPߐຊتٱஉ w ϑϦʔϥϯεͷԿͰ΋԰ w ࠷ۙͷྲྀߦΓ3VTU 5ZQF4DSJQU "844FSWFSMFTT "84$%, w ϓϩάϥϛϯάҎ֎ͷझຯֆɺ૸Δ͜ͱ w ޷͖ͳΞΠεϗοέʔνʔϜ1JUUTCVSHI1FOHVJOT LJLVPNBY DPEFNPOHFSJP

Slide 3

Slide 3 text

#VFGZͱ͸ IUUQTCVFGZPSH w #VMNBϕʔεͷ7VFKT༻ܰྔ6*ίϯϙʔωϯτ w ެࣜ൛ CFVGZ! ͸7VFઐ༻ #VFGZGPS7VF w ։ൃ൛ !OUPIRCVFGZOFYU ͸7VFઐ༻ #VFGZGPS7VF

Slide 4

Slide 4 text

#VFGZ.BJOUBJOFSͷมભ w ݪ࡞ऀ!SBGBCFSBMEP w લͷ.BJOUBJOFS!KUPNNZ w ೥݄ʙ!XFTEFWQSP!LJLVPNBY ࢲ w ͦͷଞଟ͘ͷίϯτϦϏϡʔλʹࢧ͑ΒΕ͍ͯ·͢

Slide 5

Slide 5 text

FYUFOEͷഇࢭ QSPQͷॳظԽͱUIJT 7VF

Slide 6

Slide 6 text

FYUFOEͷഇࢭ QSPQͷॳظԽͱUIJT 7VF

Slide 7

Slide 7 text

FYUFOEͷഇࢭ w #VFGZͷศརػೳ w ίϯϙʔωϯτΛ໌ࣔతʹຒΊࠐ·ͳͯ͘΋ϞʔμϧΛදࣔͰ͖Δ 1SPHSBNNBUJDػೳ this.$buefy.dialog.alert('Everything looks fine!')

Slide 8

Slide 8 text

FYUFOEͷഇࢭ #VFGZGPS7VFͷ࣮૷ w άϩʔόϧͳ7VFΠϯελϯεΛFYUFOE͠ɺಈతʹੜ੒ͨ͠%0.ʹϞʔμϧ ΛϚ΢ϯτ const ModalComponent = window.Vue.extend(Modal) const component = new ModalComponent({ el: document.createElement('div') }) ࣮ࡍͷίʔυΛ؆ུԽ 7VFͰFYUFOE͸ഇࢭ

Slide 9

Slide 9 text

FYUFOEͷഇࢭ #VFGZGPS7VFͷ࣮૷ެ։"1*ͷΈͰ࣮૷ w DSFBUF"QQͰ৽͍͠"QQΠϯελϯεΛ࡞੒ͯ͠ϞʔμϧΛϚ΢ϯτ const vueInstance = createApp({ render() { return h(Modal, { onClose: () => vueInstance.unmount() }) } }) vueInstance.mount(document.createElement('div')) ࣮ࡍͷίʔυΛ؆ུԽ ϝΠϯͷ"QQʹΠϯετʔϧͨ͠ϓϥάΠϯ౳͕Ϟʔμϧ಺Ͱ࢖͑ͳ͍

Slide 10

Slide 10 text

FYUFOEͷഇࢭ #VFGZGPS7VFͷ࣮૷ݱঢ় w ϝΠϯ"QQͷ"QQ$POUFYU @DPOUFYU ͷத਎Λ৽͍͠"QQʹίϐʔ const { _context: srcContext } = mainApp const { _context: destContext } = destApp destContext.config = srcContext.config destContext.mixins = srcContext.mixins destContext.components = srcContext.components destContext.directives = srcContext.directives destContext.provides = srcContext.provides destContext.optionsCache = srcContext.optionsCache destContext.propsCache = srcContext.propsCache destContext.emitsCache = srcContext.emitsCache if ('__VUE_I18N_SYMBOL__' in mainApp) { destApp.__VUE_I18N_SYMBOL__ = mainApp.__VUE_I18N_SYMBOL__ } Πϯετʔϧ࣌ʹ͓֮͑ͯ͘ 👎ଞͷϓϥάΠϯͱͷ૬ੑ໰୊ ࣮ࡍͷίʔυΛ؆ུԽ 👎7VFͷ಺෦ߏ଄ʹґଘ͗͢͠

Slide 11

Slide 11 text

FYUFOEͷഇࢭ QSPQͷॳظԽͱUIJT 7VF

Slide 12

Slide 12 text

QSPQͷॳظԽͱUIJT #VFGZGPS7VFͷ࣮૷ w λϒදࣔͳͲͰҰ෦QSPQͷॳظԽʹ7VFͷ಺෦ϑΟʔϧυUIJT@VJEΛ࢖༻ w ஋ͷলུ࣌ʹϢχʔΫ͞Λอূ͢ΔͨΊ props: { value: { type: String, default() { return this._uid.toString() } } } ࣮ࡍͷίʔυΛ؆ུԽ 7VFͰ͸QSPQͷσϑΥϧτؔ਺ͰUIJTΛ࢖༻Ͱ͖ͳ͍ ˠ୯७ʹUIJTVJEʹஔ͖׵͑ΒΕͳ͍

Slide 13

Slide 13 text

QSPQͷॳظԽͱUIJT #VFGZGPS7VFͷ࣮૷۪௚൛ w ϥϯμϜͳ஋ͰQSPQΛॳظԽͯ͠ϢχʔΫ͞Λอূ // props: { value: { // type: String, // default() { return makeUniqueId() } // }} function makeUniqueId() { const values = new Uint8Array(12) window.crypto.getRandomValues(values) return Array.prototype.map.call( values, (v) => v.toString(16) ).join(‘') } ࣮ࡍͷίʔυΛ੔ܗ 4FSWFS4JEF3FOEFSJOH 443 ͰXJOEPXͱཚ਺͸ޚ๏౓

Slide 14

Slide 14 text

QSPQͷॳظԽͱUIJT #VFGZGPS7VFͷ࣮૷ݱঢ় w QSPQΛOVMMͰॳظԽ͠ɺDPNQVUFEͰUIJTVJEʹϑΥʔϧόοΫ props: { value: { type: String, default: null } }, computed: { uniqueValue() { return this.value != null ? this.value : this.$.uid } } ࣮ࡍͷίʔυΛ؆ུԽ

Slide 15

Slide 15 text

FYUFOEͷഇࢭ QSPQͷॳظԽͱUIJT 7VF

Slide 16

Slide 16 text

7VF w 7VF΁ͷҠߦ࡞ۀͷେ൒͸೥݄ʙ݄ࠒˠ7VF w 7VFͷมߋ͕Өڹ

Slide 17

Slide 17 text

7VF มߋ఺WGPSதͷSFG w WGPSதͷSFG͸഑ྻͱͯ͠ΞΫηεՄೳʹ w 7VFͱಉ͡ڍಈʹ໭ͬͨˠ7VF༻ͷରࡦ͕ٲʹ 7VFެࣜυΩϡϝϯτ IUUQTKBWVFKTPSHHVJEFFTTFOUJBMTUFNQMBUFSFGTSFGTJOTJEFWGPS ΑΓൈਮ ˡ

Slide 18

Slide 18 text

7VF ͪͬͱ΋ϚΠφʔ͡Όͳ͍ϚΠφʔνΣϯδ w 7VF ʙͷڍಈWGPSͷ࠷ޙͷཁૉͷΈSFGTʹ֨ೲ ඇ഑ྻ w SFG໊ʹΠϯσοΫεΛ௥Ճ໊ͯ͠લͷॏෳΛճආ
  • {{ childItem.label }}
  • const tab = this.$refs[`tabLink${index}`] tab.focus() ࣮ࡍͷίʔυΛ؆ུԽ ࣮ࡍͷίʔυΛ؆ུԽ

    Slide 19

    Slide 19 text

    7VF ϋΠϒϦου w SFG໊ʹΠϯσοΫεΛ௥Ճ໊ͯ͠લͷॏෳΛճආ w SFGT͕഑ྻ͔൱͔Ͱόʔδϣϯ൑ఆ const tab = this.$refs[`tabLink${index}`] if (Array.isArray(tab)) { tab = tab[0] } tab.focus() ࣮ࡍͷίʔυΛ؆ུԽ WҎ߱ˠཁૉͷ഑ྻ

    Slide 20

    Slide 20 text

    ެࣜϦϦʔεʹ޲͚ͯ w 5ZQF4DSJQU΁ͷҠߦ w ෆ۩߹मਖ਼ w ࡉ͔͍#VFGZGPS7VFͱͷඇޓ׵ੑͷൃݟͱରԠ w "1*υΩϡϝϯτͷߋ৽ w /VYU༻ͷϞδϡʔϧ։ൃ ͝ࢼ༻ɾίϯτϦϏϡʔγϣϯ͓଴͍ͪͯ͠·͢ IUUQTHJUIVCDPNOUPIRCVFGZOFYU