{"id":702,"date":"2023-05-14T17:05:36","date_gmt":"2023-05-14T09:05:36","guid":{"rendered":"http:\/\/gjweb.top\/?p=702"},"modified":"2023-05-14T17:06:07","modified_gmt":"2023-05-14T09:06:07","slug":"06-%e7%bb%84%e4%bb%b6%e4%bc%a0%e5%80%bc","status":"publish","type":"post","link":"https:\/\/gjweb.top\/?p=702","title":{"rendered":"06.\u7ec4\u4ef6\u4f20\u503c"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"\u7236\u5b50\u7ec4\u4ef6\u4f20\u503c\">\u7236\u5b50\u7ec4\u4ef6\u4f20\u503c<\/h2>\n\n\n\n<p>\u5b50\u7ec4\u4ef6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;template&gt;<br> &nbsp;&lt;div&gt;this is childComponent {{ title }}&lt;\/div&gt;<br>&lt;\/template&gt;<br>&lt;script setup lang=\"ts\"&gt;<br>\/\/ \u5e38\u89c4<br>defineProps({<br> &nbsp; title:String<br>})<br>\/\/ \u5e38\u89c4\u8bbe\u7f6e\u9ed8\u8ba4\u503c<br>defineProps({<br> &nbsp; title:{<br> &nbsp; &nbsp; &nbsp; type:String,<br> &nbsp; &nbsp; &nbsp; default:\"\u9ed8\u8ba4\u503c\"<br> &nbsp; }<br>})<br>\/\/ TS\u8bed\u6cd5<br>defineProps&lt;{<br> &nbsp;title:string<br>}&gt;()<br>\/\/ TS\u8bbe\u7f6e\u9ed8\u8ba4\u503c<br>withDefaults(defineProps&lt;{<br> &nbsp;title:string,<br> &nbsp;arr:number&#91;]<br>}&gt;(),{<br> &nbsp;arr:()=&gt;&#91;1,2,3]<br>})<br>&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<p>\u7236\u7ec4\u4ef6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;template&gt;<br> &nbsp;&lt;div&gt; this is app&lt;\/div&gt;<br> &nbsp;&lt;HelloWorld title=\"name\"&gt;&lt;\/HelloWorld&gt;<br>&lt;\/template&gt;<br>&lt;script setup lang=\"ts\"&gt;<br>import HelloWorld from \".\/components\/HelloWorld.vue\"<br>&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u5b50\u7ec4\u4ef6\u5411\u7236\u7ec4\u4ef6\u4f20\u503c\">\u5b50\u7ec4\u4ef6\u5411\u7236\u7ec4\u4ef6\u4f20\u503c<\/h2>\n\n\n\n<p>\u5b50\u7ec4\u4ef6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;template&gt;<br> &nbsp;&lt;div&gt;this is childComponent&lt;\/div&gt;<br> &nbsp;&lt;button @click=\"handleClick\"&gt;click&lt;\/button&gt;<br>&lt;\/template&gt;<br>&lt;script setup lang=\"ts\"&gt;<br>const emit = defineEmits(&#91;'on-click'])<br>const handleClick = ()=&gt;{<br> &nbsp;emit('on-click',\"\u8fd9\u662f\u5b50\u7ec4\u4ef6\u7684\u4f20\u503c\")<br>}<br>\/\/ TS\u5199\u6cd5<br>const emit = defineEmits&lt;{<br>  (e:\"on-click\",name:string):void<br>}&gt;();<br>const handleClick = ()=&gt;{<br> &nbsp;emit('on-click',\"\u8fd9\u662f\u5b50\u7ec4\u4ef6\u7684\u4f20\u503c\")<br>}<br>&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<p>\u7236\u7ec4\u4ef6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;template&gt;<br> &nbsp;&lt;div&gt; this is app&lt;\/div&gt;<br> &nbsp;&lt;HelloWorld @on-click=\"getChildData\"&gt;&lt;\/HelloWorld&gt;<br>&lt;\/template&gt;<br>&lt;script setup lang=\"ts\"&gt;<br>import HelloWorld from \".\/components\/HelloWorld.vue\";<br>const getChildData = (data:string)=&gt;{<br> &nbsp;console.log(data);<br>}<br>&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u4f9d\u8d56\u6ce8\u5165-provide-inject-\u65b9\u5f0f\">\u4f9d\u8d56\u6ce8\u5165 provide \/ inject \u65b9\u5f0f<\/h2>\n\n\n\n<p>\u7236\u7ec4\u4ef6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;template&gt;<br> &nbsp;&lt;HelloWorld&gt;&lt;\/HelloWorld&gt;<br>&lt;\/template&gt;<br>&lt;script setup lang=\"ts\"&gt;<br>import {ref,provide} from \"vue\";<br>import HelloWorld from \".\/components\/HelloWorld.vue\"<br>const data = ref(\"\u7236\u7ec4\u4ef6\u7684provide\u4f20\u503c\")<br>provide(\"data\",data)<br>&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<p>\u5b50\u7ec4\u4ef6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;template&gt;<br> &nbsp;&lt;h2&gt;this is childComponent {{ data }}&lt;\/h2&gt;<br>&lt;\/template&gt;<br>&lt;script setup lang=\"ts\"&gt;<br>import { inject,Ref, ref } from 'vue'<br>const data = inject('data',ref(\"\"))<br>\/\/\u4f7f\u7528\u6cdb\u578b<br>const data = inject&lt;Ref&lt;string&gt;&gt;(\"data\",ref(\"\"))<br>&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\u6ce8\u610f: \u4f7f\u7528 provide \u548c inject \u4f20\u53c2\u5b50\u7ec4\u4ef6\u53ef\u4ee5\u76f4\u63a5\u4fee\u6539, \u5176\u4ed6\u7ec4\u4ef6\u4e5f\u4f1a\u540c\u6b65\u66f4\u66f4\u65b0<\/p><\/blockquote>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u5144\u5f1f\u7ec4\u4ef6\u4f20\u503c\">\u5144\u5f1f\u7ec4\u4ef6\u4f20\u503c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"\u81ea\u5b9a\u4e49-eventbus-\u4f20\u53c2\">\u81ea\u5b9a\u4e49 eventBus \u4f20\u53c2<\/h3>\n\n\n\n<p>\u521b\u5efa lib\/eventBus.ts<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type EventHandler = (data?: any) =&gt; void;<br>export default class EventBus {<br> &nbsp;private events: Record&lt;string, EventHandler&#91;]&gt; = {};<br>\u200b<br> &nbsp;public emit(eventName: string, data?: any): void {<br> &nbsp; &nbsp;if (this.events&#91;eventName]) {<br> &nbsp; &nbsp; &nbsp;this.events&#91;eventName].forEach((fn) =&gt; {<br> &nbsp; &nbsp; &nbsp; &nbsp;fn(data);<br> &nbsp; &nbsp;  });<br> &nbsp;  }<br>  }<br> &nbsp;public on(eventName: string, fn: EventHandler): void {<br> &nbsp; &nbsp;this.events&#91;eventName] = this.events&#91;eventName] || &#91;];<br> &nbsp; &nbsp;this.events&#91;eventName].push(fn);<br>  }<br> &nbsp;public off(eventName: string, fn: EventHandler): void {<br> &nbsp; &nbsp;if (this.events&#91;eventName]) {<br> &nbsp; &nbsp; &nbsp;for (let i = 0; i &lt; this.events&#91;eventName].length; i++) {<br> &nbsp; &nbsp; &nbsp; &nbsp;if (this.events&#91;eventName]&#91;i] === fn) {<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.events&#91;eventName].splice(i, 1);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;<br> &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp;  }<br> &nbsp;  }<br>  }<br>}<\/code><\/pre>\n\n\n\n<p>\u5728 main.ts \u4e2d\u914d\u7f6e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { createApp } from 'vue'<br>import '.\/style.css'<br>import App from '.\/App.vue'<br>import EventBus from \".\/lib\/eventBus.ts\";<br>const $bus = new EventBus();<br>const app = createApp(App)<br>app.config.globalProperties.$bus = $bus;<br>app.mount('#app')<\/code><\/pre>\n\n\n\n<p>\u5728\u7ec4\u4ef6A\u4e2d\u8bbe\u7f6e emit<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;template&gt;<br> &nbsp;&lt;h1&gt;this is comA&lt;\/h1&gt;<br> &nbsp;&lt;button @click=\"handleClick\"&gt;click&lt;\/button&gt;<br>&lt;\/template&gt;<br>&lt;script setup lang=\"ts\"&gt;<br>import {getCurrentInstance} from \"vue\"<br>let {proxy}:any = getCurrentInstance();<br>const handleClick = ()=&gt;{<br> &nbsp;proxy.$bus.emit(\"update\",\"\u4f20\u53c2\")<br>}<br>&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<p>\u5728\u7ec4\u4ef6B \u4e2d\u63a5\u6536\u4f20\u53c2<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;template&gt;<br> &nbsp;&lt;h1&gt;this is comB&lt;\/h1&gt;<br>&lt;\/template&gt;<br>&lt;script setup lang=\"ts\"&gt;<br>import {getCurrentInstance} from \"vue\"<br>let {proxy}:any = getCurrentInstance();<br>proxy.$bus.on(\"update\",(data:any)=&gt;{console.log(data);})<br>&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"\u4f7f\u7528\u7b2c\u4e09\u90a3\u65b9-mitt-\u4f20\u53c2\">\u4f7f\u7528\u7b2c\u4e09\u90a3\u65b9 mitt \u4f20\u53c2<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\u539f\u7406\u5c31\u662f eventBus<\/p><\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"\u5b89\u88c5\">\u5b89\u88c5<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn add mitt<\/code><\/pre>\n\n\n\n<p>\u521b\u5efa src \/ types \/ mitt.d.ts \u5b58\u653e mitt \u7684\u7c7b\u578b\u58f0\u660e\u6587\u4ef6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>declare module 'mitt' {<br> &nbsp;type EventHandler&lt;T = any&gt; = (event?: T, ...args: any&#91;]) =&gt; void;<br> &nbsp;type WildcardEventHandler&lt;T = any&gt; = (type: string | symbol, event?: T, ...args: any&#91;]) =&gt; void;<br> &nbsp;type MittEmitter&lt;T = any&gt; = {<br> &nbsp; &nbsp;on(type: string | symbol, handler: EventHandler&lt;T&gt;): void;<br> &nbsp; &nbsp;off(type: string | symbol, handler: EventHandler&lt;T&gt;): void;<br> &nbsp; &nbsp;emit(type: string | symbol, event?: T, ...args: any&#91;]): void;<br>  };<br> &nbsp;type MittAllEmitter&lt;T = any&gt; = {<br> &nbsp; &nbsp;on(type: string | symbol, handler: EventHandler&lt;T&gt;): void;<br> &nbsp; &nbsp;on(handler: WildcardEventHandler&lt;T&gt;): void;<br> &nbsp; &nbsp;off(type: string | symbol, handler: EventHandler&lt;T&gt;): void;<br> &nbsp; &nbsp;off(handler: WildcardEventHandler&lt;T&gt;): void;<br> &nbsp; &nbsp;emit(type: string | symbol, event?: T, ...args: any&#91;]): void;<br>  };<br> &nbsp;function mitt&lt;T = any&gt;(all?: boolean): MittEmitter&lt;T&gt; | MittAllEmitter&lt;T&gt;;<br> &nbsp;export default mitt;<br>}<\/code><\/pre>\n\n\n\n<p>\u5728 main.ts \u4e2d<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { createApp } from 'vue'<br>import '.\/style.css'<br>import App from '.\/App.vue'<br>import mitt from 'mitt'<br>const $bus = mitt();<br>const app = createApp(App)<br>app.config.globalProperties.$bus = $bus;<br>app.mount('#app')<\/code><\/pre>\n\n\n\n<p>\u4f7f\u7528\u540c\u4e0a\u4e00\u8282\u7684 eventBus \u4f7f\u7528\u65b9\u6cd5<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7236\u5b50\u7ec4\u4ef6\u4f20\u503c \u5b50\u7ec4\u4ef6 \u7236\u7ec4\u4ef6 \u5b50\u7ec4\u4ef6\u5411\u7236\u7ec4\u4ef6\u4f20\u503c \u5b50\u7ec4\u4ef6 \u7236\u7ec4\u4ef6 \u4f9d\u8d56\u6ce8\u5165 provide \/ inject  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[64],"tags":[],"class_list":["post-702","post","type-post","status-publish","format-standard","hentry","category-vue3"],"_links":{"self":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/702","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=702"}],"version-history":[{"count":2,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/702\/revisions"}],"predecessor-version":[{"id":704,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/702\/revisions\/704"}],"wp:attachment":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=702"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=702"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=702"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}