Vue父子组件间传值方法集

props和$emit+事件

父传子

//父组件:
<vue-child :title="父组件变量"></vue-child>
// 子组件中:
export default {
  props: {
    title: {
      type: String,
      default: 'hello world'
    }
  }
}

子传父

//子组件:
<div class="testCom">
    <input type="text" v-model="message" />
    <button @click="click">传值给父组件</button>
</div>

<script>
	export default {
	    data() {
	        return {
	          // 默认
	          message: '我是来自子组件的消息'
	        }
	    },
	    methods: {
	      click() {
	            this.$emit('childFn', this.message);
	        }
	    }    
	}
</script>
//父组件
<div class="test">
      <test-com @childFn="parentFn"></test-com>
      <br/> 
      子组件传来的值 : {{message}}
</div>

<script>
	export default {
	    // ...
	    data() {
	        return {
	             message: ''
	        }
	    },
	    methods: {
	       parentFn(data) {
	        this.message = data;
	      }
	    }
	}
</script>

父传子数据监听

//可以通过监听父组件传值的变化对数据进行操作
watch: {
    firstName(newValue, oldValue) {
         console.log(newValue,oldValue)
    }
  } 

$ parent/$children

父组件传值子组件

//父组件:
<div>
    <h1>这是父组件</h1>
    <vuechild></vuechild>
</div>


<script>
  // 引入子组件
  import vueChild from './Child'
  export default {
    name: 'Parent',
    components: {
      vuechild
    },
    data () {
      return {
        msg: 'data from parent'
      }
    },
    methods: {
      parentFn () {
        console.log('parent fun')
      }
    }
  }
</script>

//子组件:
<div>
    <h1>子组件</h1>
    <button @click="showParent">调用父组件的数据和方法</button>
</div>


<script>
  export default {
    name: 'Child',
    methods: {
      showParent () {
        // 获取到所有的父组件
        console.log(this.$parent)
        // 获取指定父组件中的指定数据
        console.log(this.$parent.msg)
        // 调用父组件的方法
        this.$parent.parentFn()
      }
    }
  }
</script>

子组件传值父组件

//子组件:

<div>
    <h1>子组件</h1>
</div>


<script>
  export default {
    name: 'Child',
    data () {
      return {
        msg: 'msg from child'
      }
    },
    methods: {
      childFn () {
        console.log('child fun')
      }
    }
  }
</script>

//父组件:
<div>
    <h1>父组件</h1>
    <vuechild></vuechild>
</div>


<script>
  // 引入子组件
  import vueChild from './Child'
  export default {
    name: 'Parent',
    components: {
      vuechild
    },
    mounted () {
      // 获取到所有的子组件,是一个数组
      console.log(this.$children)
      // 获取指定子组件中的指定数据
      console.log(this.$children[0].msg)
      // 调用子组件的方法
      this.$children[0].childFn()
    }
  }
</script>

$refs

//父组件:
 <!-- 父组件获取子组件的值 -->
 <v-header ref="getChild"></v-header>
 <button @click="getData">父组件获取子组件的值和方法</button>

<script>
	import Header from './header';
	export default {
	  data(){
	    return{
	        msg:'父组件数据'
	    }
	  },
	  components:{
	      'v-header':Header
	  },
	  methods:{
	      getData(){
	        this.$refs.getChild.childFn();
	      },
	      parentFn(){
	        alert('父组件')
	      }
	  }
	 
	 
	}
</script>
//子组件:
<div id="app1">
    {{msg}}
    <button @click="getParent()">获取付父组件的值和方法</button>
   	<hr>
</div>

<script>
	export default {
	  data(){
	    return{
	        msg:'子组件消息',
	    }
	  },
	  methods:{
	    childFn(){
	      alert(111)
	    },
	    getParent(){
	      alert(this.$parent.msg);
	      this.$parent.parentFn()
	    }
	  }
	 
	}
</script>

更多组件间通信方法请移步→vue组件间通信方法集传送门

  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Vue项目中,父子组件传值有多种方法可以实现。其中一种常用的方法是使用props和$emit。 首先,在父组件中,可以通过props属性将数据传递给子组件。在子组件中,通过props选项接收父组件传递的数据。例如,在父组件中定义一个子组件,并通过props属性传递一个名为"name"的数据给子组件: ```html <Child :name="小张"></Child> ``` 在子组件中,通过props选项接收父组件传递的数据: ```javascript props: \["name"\] ``` 另一种方法是使用$emit来自定义事件,在子组件中触发该事件并传递数据给父组件。在父组件中,通过监听子组件触发的事件来获取子组件传递的数据。例如,在子组件中触发一个名为"increment"的自定义事件,并传递数据"我是子组件"给父组件: ```javascript this.$emit("increment", "我是子组件") ``` 在父组件中,通过监听子组件触发的事件来获取子组件传递的数据: ```html <Child @increment="f1"></Child> ``` ```javascript methods: { f1(data) { console.log(data) // 打印"我是子组件" } } ``` 这样,父组件就可以接收到子组件传递的数据了。 除了props和$emit,还有其他方法可以实现父子组件传值,如使用$parent和$children来访问父组件和子组件的实例,或者使用$ref来引用子组件。但是在实际开发中,props和$emit是最常用的方法。 #### 引用[.reference_title] - *1* *3* [vue父子组件传值方法](https://blog.csdn.net/YoungMan_09/article/details/123451827)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Vue父子组件传值](https://blog.csdn.net/qq_49867247/article/details/123480614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值