我在上一篇說了一下父子組件之間是如何傳值的,今天說一會兒組件若是須要改變傳過來的數據供本身使用。javascript
在 App.vue 中html
<template> <div class="hello"> <h3>我是 App 父組件</h3> <h4>訪問本身的數據:{{msg}},{{name}},{{user.id}}</h4> <hr> <!-- 1. 在調用子組件時,綁定想要獲取的父組件中的數據 --> <Hello :message="msg"></Hello> </div> </template> <script> // 引入 Hello 組件 import Hello from './assets/components/Hello.vue' export default { data(){ return { msg:'父組件', name:'tom', age:'22', user:{ id:1234, userName:'Jack' } } }, // 註冊 Hello 組件 components:{ Hello } } </script>
在 Hello.vue 中vue
<template> <div class="hello"> <h3>我是 hello 子組件</h3> <!-- 在頁面中直接渲染便可 --> <h4>訪問父組件中的數據: {{msg}}</h4> <button @click="change">改變父組件的數據</button> </div> </template> <script> export default { // 2. 在子組件內部,使用 props 選項聲明獲取的數據,即接收來自父組件中的數據 props:['message'], data(){ return { // 定義一個局部變量,並用 props 的值來初始化它 msg:this.message } }, methods:{ // 定義一個方法,來觸發改變父組件的數據 change(){ this.msg = '我改變了父組件的數據' } } } </script>
效果圖:java
在 Hello.vue 中改動數組
<script> export default { // 2. 在子組件內部,使用 props 選項聲明獲取的數據,即接收來自父組件中的數據 props:['message'], data(){ return { // 定義一個局部變量,並用 props 的值來初始化它 msg:this.message } }, computed:{ // 定義一個方法,來觸發改變父組件的數據 change(){ return this.msg = '我改變了父組件的數據' } } } </script>
當頁面渲染成功自動完成計算ide
在 App.vue 中把 template 的內容更改成ui
<template>
<div class="hello"> <h3>我是 App 父組件</h3> <h4>訪問本身的數據:{{msg}}</h4> <hr> <!-- 1. 在調用子組件時,綁定想要獲取的父組件中的數據 --> <!-- .sync 會被擴展爲一個自動更新父組件屬性的 v-on 監聽器 --> <Hello :message.sync="msg"></Hello> </div> </template>
在 Hello.vue 中更改成this
<template> <div class="hello"> <h3>我是 hello 子組件</h3> <!-- 在頁面中直接渲染便可 --> <h4>訪問父組件中的數據: {{message}}</h4> <button @click="change">改變父組件的數據</button> </div> </template> <script> export default { // 2. 在子組件內部,使用 props 選項聲明獲取的數據,即接收來自父組件中的數據 props:['message'], methods:{ change(){ // 使用 .sync 時,須要顯式的觸發一個更新事件 // update 爲固定寫法,後面跟將要被改變的數據對象,接着寫替換的數據 this.$emit('update:message','我改變了父組件的數據') } } } </script>
效果爲:spa
在 App.vue 中code
<template> <div class="hello"> <h3>我是 App 父組件</h3> <h4>訪問本身的數據:{{user.userName}}</h4> <hr> <!-- 2. 在調用子組件時,綁定想要獲取的父組件中的數據 --> <Hello :user="user"></Hello> </div> </template> <script> // 引入 Hello 組件 import Hello from './assets/components/Hello.vue' export default { data(){ return { // 1. 在父組件中把數據寫成對象的形式 user:{ id:1234, userName:'Jack' } } }, // 註冊 Hello 組件 components:{ Hello } } </script>
在 Hello.vue 中
<template> <div class="hello"> <h3>我是 hello 子組件</h3> <!-- 5. 在頁面中直接渲染便可 --> <h4>訪問父組件中的數據: {{user.userName}}</h4> <button @click="change">改變父組件的數據</button> </div> </template> <script> export default { // 3. 在子組件內部,使用 props 選項聲明獲取的數據,即接收來自父組件中的數據 props:['message','user'], methods:{ // 4.直接修改 user 對象中的數據 change(){ this.user.userName = 'Tom' } } } </script>
效果以下:
今天的分享就到這裏,若有不足,歡迎留言討論