原文博客地址: https://finget.github.io/2018/06/08/vue-react-props/
// father.js <template> <div id="father"> 這是父組件: <p>父組件</p> <Child ref="child" :msg="msg" @click="faClick"></Child> </div> </template> <script> import Child from './child'; export default { data() { return { msg: '父組件傳給子組件' // 傳遞給子組件的值 }; }, components: { Child }, methods: { faClick(msg) { // msg 子組件傳遞給父組件的值 alert(msg); }, childSayHello() { // 父組件調用子組件的方法 this.$refs,child.sayHello(); } } } </script>
// child.js <template> <div id="child"> 這是子組件:<p>父組件傳遞的值:{{msg}}</p> <button @click="click">接收父組件方法</button> </div> </template> <script> export default { props: ['msg'], data() { return { childMsg : '哈哈哈' }; }, methods: { click() { this.$emit('click',this.childMsg); // 第一個參數爲派發的事件名, 第二個參數爲傳遞的值 }, sayHello() { alert('I am child!'); } } } </script>
props:['msg']
(不能省略引號):msg="msg"
的方法傳遞變量,也能夠經過 msg="msg"
傳遞字符串ref="xxx"
屬性this.$refs.xxx.方法
調用this.$emit('事件名','參數')
派發一個事件,並傳遞參數@事件名
的方式監聽事件子組件能夠經過this.$parent.xxx
直接調用父組件的方法。javascript
經過子組件派發的事件,不只能夠向父組件傳遞參數,父組件也能夠經過傳遞的參數,改變向子組件傳遞的值,從而改變子組件。
props 還能夠進行一系列的格式校驗,更多內容查看官網html
props: { // 基礎的類型檢查 (`null` 匹配任何類型) propA: Number, // 多個可能的類型 propB: [String, Number], // 必填的字符串 propC: { type: String, required: true }, // 帶有默認值的數字 propD: { type: Number, default: 100 }, // 帶有默認值的對象 propE: { type: Object, // 對象或數組且必定會從一個工廠函數返回默認值 default: function () { return { message: 'hello' } } }, // 自定義驗證函數 propF: { validator: function (value) { // 這個值必須匹配下列字符串中的一個 return ['success', 'warning', 'danger'].indexOf(value) !== -1 } } }
// father.js import React, { Component } from 'react' import Child from './child.js'; class Father extends Component { constructor(props) { super(props); this.state = { con: '父組件給子組件' } } // 傳遞給子組件的方法,並接收子組件實例,綁定在this.child上 onRef = (ref) => { this.child = ref } // 經過this.child 就能夠直接調用子組件的內部方法 click = () => { this.child.sayHello(); } // 傳遞個子組件的方法 faClick = (msg) => { alert(msg); } render() { return ( <div> <p>這是父組件</p> <button onClick={this.click}>調用子組件方法</button> <div> 這是子組件 <Child onRef={this.onRef} connect={this.state.con} click={(msg) => this.faClick(msg)}/> </div> </div> ) } } export default Father;
// child.js import React, { Component } from 'react' class Child extends Component { constructor(props) { super(props); } // 調用父組件傳遞的方法,並傳遞子組件實例 componentDidMount(){ this.props.onRef(this); } // 調用父組件傳遞的方法 click= ()=> { this.props.click('哈啊哈'); } // 子組件內部方法 sayHello = () => { alert('I am child'); } render() { return ( <div> <p>{this.props.connect}</p> <button onClick={this.click}>接收父組件的方法</button> </div> ) } } export default Child;
connect={this.state.con}
方式能夠傳遞值this.props.connect
接收onRef={this.onRef}
componentDidMount
生命週期裏 調用這個方法,並回傳自身實例this.child = ref
this.child.xxx
直接調用子組件方法click={(msg) => this.faClick(msg)}
onClick={this.click}
click= ()=> {this.props.click('哈啊哈');}
從而傳遞參數this.props.xxx
調用
不能直接經過
<button onClick={this.props.click('哈啊哈')}>接收父組件的方法</button>
進行傳參,這樣在組件初始化時,事件就執行了。
this.props.click
能夠調用父組件傳遞的方法,並傳參