react 語法小知識

創建好了react項目結構之後,就需要我們寫一堆的組件了,目前react組件有兩種常用的寫法:

1,函數組件:

import React from 'react';
function LogIn(props){
    return(
        <button>登錄</button>
    )
}
export default LogIn;

2,class組件:

import React from 'react';
class LoginControl from React.Component{
   constructor(props){
        //數據初始化
        super(props);
        
    }
    componentWillMount(){
        //數據已經初始化,但是還沒有渲染dom,一般很少用
    }

    componentDidMount(){
        //第一次渲染dom,在這裏可以請求ajax,並setDate重新渲染數據


    }
    componentWillReceiveProps(){
        //在接受父組件改變後的props需要重新渲染組件時用的比較多

    }
    componentWillUnmount(){
        //卸載和數據銷燬
    }
    render() {
        /*js處理*/
        return (
            <div>
               
            </div>
        )
    }
}
export default HomePage1;

相信JSX渲染都不會陌生了,這裏就不多說了,直接用{}大花括號渲染就行了, 注意必須是有效的 JavaScript 表達式

接下來我重點說明一點,在react中的事件處理,以及props這個重要的屬性,還有就是子父組件之間的如何使用以及如何傳遞參數等。以下基於class組件:

拿官網給的登錄,退出來爲例:

首先寫個登錄和退出的小組件:

登錄:
import React from 'react';
function LogIn(props){
    console.log(props)
    return(
        <button onClick={props.onClick}>登錄</button>
    )
}
export default LogIn;
退出:
import React from 'react';
function LogOut(props){
    console.log(props)
    return(
        <button onClick={props.onClick}>退出</button>
    )
}
export default LogOut;

接下來我要寫個登錄控制器來渲染上面的組件:

import React from 'react';
import LogOut from "./LogOut";
import LogIn from "./LogIn";
class HomePage1 extends React.Component {
    constructor(props){
        //數據初始化
        super(props);
        this.logIn = this.logIn.bind(this);
        this.logOut = this.logOut.bind(this);
        this.state = {
            a:1,
            b:2,
            c:3,
            isLogin:false,
            user:null
        }
    }
    componentWillMount(){
        //數據已經初始化,但是還沒有渲染dom,一般很少用
    }

    componentDidMount(){
        //第一次渲染dom,在這裏可以請求ajax,並setDate重新渲染數據


    }
    componentWillReceiveProps(){
        //在接受父組件改變後的props需要重新渲染組件時用的比較多

    }
    componentWillUnmount(){
        //卸載和數據銷燬
    }

    //寫任何想寫的方法******************

    logIn(e){
        alert("登錄了")
        this.setState({
            isLogin:true,
            user:e
        })
    }
    
    logOut(){
        alert("退出登錄了")
        this.setState({
            isLogin:false,
            user:null
        })
    }

    render() {

        let button;
        if(this.state.isLogin){
            button = <LogOut onClick={this.logOut}/>
        }else{
            button = <LogIn onClick={(e)=>this.logIn('admin',e)}/>
        }



        return (
            <div>
                <h1>Hello,{this.state.a+this.state.b}</h1>
                {button}
                <p>{this.state.user}</p>
            </div>
        )
    }
}

export default HomePage1;

其中,我對我學習中碰到的問題簡略的說一下:

1.剛開始學習react,竟然不知道在哪裏寫個自己的方法,經過翻查文檔以及度娘,才知道,直接在class組件中寫就行了,當然方法寫完了,要去觸發他,接下來怎麼觸發呢,又是個問題,react給提供了兩種:

1.1 在constructor構建中寫入this.LogIn=this.LogIn.bind(this); 具體爲什麼這樣寫,文檔給的已經很清楚了,然後在return的元素中開始觸發onClick="{this.Login}"就可以了,,,

1.2在寫方法的時候,使用箭頭函數,Login = () =>{},然後在return的元素中開始觸發onClick="{this.Login}"就可以了,,,

等,,,,,我如果想穿參數怎麼辦呢??官網也給了兩種方法:

<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>

在這兩種情況下,React 的事件對象 e 會被作爲第二個參數傳遞。如果通過箭頭函數的方式,事件對象必須顯式的進行傳遞,而通過 bind 的方式,事件對象以及更多的參數將會被隱式的進行傳遞。 (我習慣性的用第一種方法了)

2.對於props這個屬性,官網也給提出了,非常重要的屬性,寫這個小案例的時候我就採坑了。。。。props主要用於組件之間的參數傳遞。

2.1父子傳值。

.向下傳值--父組件向子組件傳值
父組件通過props傳遞一個不是方法的數據,給子組件;

//父組件中
<Child data={[1,2,3]} />
//子組件中
console.log(this.props.data);

2.向上傳值--子組件向父組件傳值
父組件通過props向子組件傳入一個方法,子組件在通過調用該方法,並將數據以參數的形式傳給父組件,父組件可以在該方法中對傳入的數據進行處理;

//父組件
import Child from './Child.js';
export default class Parent extend compenent{
  getData=(data)=>{
    console.log(data);
  }
  render(){
    return (
      <div>
        父組件
        <Child getData={this.getData}/>
      </div>
    )
  }
}

//子組件
export default class Child extend compenent{
  state={
    data:[1,2,3]
  }
  render(){
    const {data}=this.state;
    return (
      <div>
        子組件
        <button onClick={()=>{this.props.getData(data)}}><button>
      </div>
    )
  }
}

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章