Vue


组件传值

<h3>props 父传子:</h3> <p>父组件给子组件一个礼物,礼物是一辆车 BMW</p> <pre><code class="language-javascript">&amp;lt;template&amp;gt;   &amp;lt;div&amp;gt;我是父组件&amp;lt;/div&amp;gt;   &amp;lt;Child :gift=&amp;quot;car&amp;quot;&amp;gt;&amp;lt;/Child&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { ref } from 'vue' import Child from '@/components/Child.vue' let car = ref('BMW') &amp;lt;/script&amp;gt;</code></pre> <pre><code class="language-javascript">&amp;lt;template&amp;gt; &amp;lt;div&amp;gt;我是子组件&amp;lt;/div&amp;gt; {{ gift }} &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; let props = defineProps(['gift']) console.log(props.gift) &amp;lt;/script&amp;gt;</code></pre> <p>父组件换礼物了,礼物是一辆车 Benz,点击按钮之后,子组件的模板自动更新,是响应式的</p> <pre><code class="language-javascript">&amp;lt;template&amp;gt; &amp;lt;div&amp;gt;我是父组件&amp;lt;/div&amp;gt; &amp;lt;Child :gift=&amp;quot;car&amp;quot;&amp;gt;&amp;lt;/Child&amp;gt; &amp;lt;button @click=&amp;quot;change&amp;quot;&amp;gt;点击更换&amp;lt;/button&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { ref } from 'vue' import Child from '@/components/Child.vue' let car = ref('BMW') function change() { car.value = 'Benz' } &amp;lt;/script&amp;gt;</code></pre> <pre><code class="language-javascript">&amp;lt;template&amp;gt; &amp;lt;div&amp;gt;我是子组件&amp;lt;/div&amp;gt; {{ gift }} &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; let props = defineProps(['gift']) console.log(props.gift) &amp;lt;/script&amp;gt;</code></pre> <p>子组件可以监听父组件是否更换 gift 了</p> <pre><code class="language-javascript">&amp;lt;template&amp;gt; &amp;lt;div&amp;gt;我是父组件&amp;lt;/div&amp;gt; &amp;lt;Child :gift=&amp;quot;car&amp;quot;&amp;gt;&amp;lt;/Child&amp;gt; &amp;lt;button @click=&amp;quot;change&amp;quot;&amp;gt;点击更换&amp;lt;/button&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { ref } from 'vue' import Child from '@/components/Child.vue' let car = ref('BMW') function change() { car.value = 'Benz' } &amp;lt;/script&amp;gt;</code></pre> <pre><code class="language-javascript">&amp;lt;template&amp;gt; &amp;lt;div&amp;gt;我是子组件&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { watchEffect } from 'vue' let props = defineProps(['gift']) watchEffect(() =&amp;gt; { console.log('父组件传值了' + props.gift) }) &amp;lt;/script&amp;gt;</code></pre> <p>父组件想多传一些 gift</p> <pre><code class="language-javascript">&amp;lt;template&amp;gt;   &amp;lt;div&amp;gt;我是父组件&amp;lt;/div&amp;gt;   &amp;lt;Child :gifts=&amp;quot;giftList&amp;quot;&amp;gt;&amp;lt;/Child&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { ref } from 'vue' import Child from '@/components/Child.vue' let giftList = ref(['BMW','House','Girlfriend']) &amp;lt;/script&amp;gt;</code></pre> <pre><code class="language-javascript">&amp;lt;template&amp;gt; &amp;lt;div&amp;gt;我是子组件&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; const props = defineProps({ gifts: { type: Array }, money: { type: Number, default: 99 } }) console.log(props.gifts) console.log(props.money) &amp;lt;/script&amp;gt;</code></pre> <hr /> <h3>props 子传父:</h3> <p>父组件给子组件传递一个方法,子组件去执行,可以携带参数,父组件可以接收这个参数</p> <pre><code class="language-javascript">&amp;lt;template&amp;gt; &amp;lt;div&amp;gt;我是父组件&amp;lt;/div&amp;gt; &amp;lt;Child :sendToy=&amp;quot;getToy&amp;quot;&amp;gt;&amp;lt;/Child&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { ref } from 'vue' import Child from '@/components/Child.vue' function getToy(value) { console.log(value) } &amp;lt;/script&amp;gt;</code></pre> <pre><code class="language-javascript">&amp;lt;template&amp;gt; &amp;lt;div&amp;gt;我是子组件&amp;lt;/div&amp;gt; &amp;lt;button @click=&amp;quot;sendToy(toy)&amp;quot;&amp;gt;送玩具&amp;lt;/button&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { ref } from 'vue' let toy = ref('toy gun') let props = defineProps(['sendToy']) &amp;lt;/script&amp;gt;</code></pre> <hr /> <ul> <li>利用 useAttrs 父传子:</li> </ul> <pre><code class="language-javascript">App: &amp;lt;template&amp;gt;   &amp;lt;Child text=&amp;quot;App文本&amp;quot;&amp;gt;&amp;lt;/Child&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import Child from &amp;quot;@/components/Child.vue&amp;quot;; &amp;lt;/script&amp;gt;</code></pre> <pre><code class="language-javascript">Child: &amp;lt;template&amp;gt;&amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { useAttrs } from &amp;quot;vue&amp;quot;; const attrs = useAttrs(); console.log(attrs.text); &amp;lt;/script&amp;gt;</code></pre> <hr /> <ul> <li>props 和 useAttrs 的区别: <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=8ae6200fa778038803c3c1614b8d0075" alt="" /></li> </ul> <hr /> <ul> <li>emits子传父:</li> </ul> <pre><code class="language-javascript">Child: &amp;lt;template&amp;gt;&amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; const emits = defineEmits([&amp;quot;childdata&amp;quot;]); emits(&amp;quot;childdata&amp;quot;, &amp;quot;child消息&amp;quot;); &amp;lt;/script&amp;gt;</code></pre> <pre><code class="language-javascript">App: &amp;lt;template&amp;gt;   &amp;lt;Child @childdata=&amp;quot;CHILDDATA&amp;quot;&amp;gt;&amp;lt;/Child&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import Child from &amp;quot;@/components/Child.vue&amp;quot;; function CHILDDATA(s) {   console.log(s); } &amp;lt;/script&amp;gt;</code></pre> <hr /> <ul> <li>expose子组件向外暴露:</li> </ul> <pre><code class="language-javascript">Child: &amp;lt;template&amp;gt;&amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { ref, onMounted } from &amp;quot;vue&amp;quot;; let childtext = ref(&amp;quot;子组件暴露的数据&amp;quot;); defineExpose({   childtext, }); &amp;lt;/script&amp;gt;</code></pre> <pre><code class="language-javascript">App: &amp;lt;template&amp;gt;   &amp;lt;Child ref=&amp;quot;CHILDTEXT&amp;quot;&amp;gt;&amp;lt;/Child&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { ref, onMounted } from &amp;quot;vue&amp;quot;; import Child from &amp;quot;@/components/Child.vue&amp;quot;; let CHILDTEXT = ref(null); onMounted(() =&amp;gt; {   console.log(CHILDTEXT.value.childtext); }); &amp;lt;/script&amp;gt;</code></pre> <hr /> <ul> <li>利用父传子一个function,实现子传父</li> </ul> <pre><code class="language-javascript">App: &amp;lt;template&amp;gt;   &amp;lt;Child :PARENTFUNCTION=&amp;quot;parentFunction&amp;quot;&amp;gt;&amp;lt;/Child&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import Child from &amp;quot;@/components/Child.vue&amp;quot; const parentFunction = (data) =&amp;gt; {   console.log(data) } &amp;lt;/script&amp;gt;</code></pre> <pre><code class="language-javascript">Child: &amp;lt;template&amp;gt;&amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; const props = defineProps({     PARENTFUNCTION: {         type: Function     } }) props.PARENTFUNCTION(&amp;quot;子组件的数据&amp;quot;) &amp;lt;/script&amp;gt;</code></pre> <hr /> <ul> <li>provide / inject 类似消息订阅与发布:</li> </ul> <pre><code class="language-javascript">App: &amp;lt;template&amp;gt;   &amp;lt;Child&amp;gt;&amp;lt;/Child&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { provide } from &amp;quot;vue&amp;quot;; import Child from &amp;quot;@/components/Child.vue&amp;quot;; provide(&amp;quot;name&amp;quot;, &amp;quot;Andy&amp;quot;); &amp;lt;/script&amp;gt;</code></pre> <pre><code class="language-javascript">Child: &amp;lt;template&amp;gt;&amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { inject } from &amp;quot;vue&amp;quot;; let info = inject(&amp;quot;name&amp;quot;); console.log(info); &amp;lt;/script&amp;gt;</code></pre> <hr /> <h3>mitt 任意组件传值:类似于消息订阅与发布</h3> <p>下载 mitt</p> <pre><code class="language-bash">npm install mitt</code></pre> <p>新建 emitter.js</p> <pre><code class="language-javascript">import mitt from 'mitt' const emitter = mitt() export default emitter</code></pre> <p>子组件引入 emitter,并且订阅 send-toy</p> <pre><code class="language-javascript">&amp;lt;template&amp;gt; &amp;lt;div&amp;gt;我是子组件&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { ref } from 'vue' import emitter from '@/utils/emitter' emitter.on('send-toy', (value) =&amp;gt; { console.log(value) }) &amp;lt;/script&amp;gt;</code></pre> <p>父组件也引入 emitter,点击按钮之后发布一个事件 send-toy,子组件那边就会收到</p> <pre><code class="language-javascript">&amp;lt;template&amp;gt; &amp;lt;div&amp;gt;我是父组件&amp;lt;/div&amp;gt; &amp;lt;button @click=&amp;quot;send&amp;quot;&amp;gt;送玩具&amp;lt;/button&amp;gt; &amp;lt;Child&amp;gt;&amp;lt;/Child&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { ref } from 'vue' import Child from '@/components/Child.vue' import emitter from '@/utils/emitter' let toy = ref('toy gun') function send() { emitter.emit('send-toy', toy.value) } &amp;lt;/script&amp;gt;</code></pre>

页面列表

ITEM_HTML