01.基礎(chǔ)與組件

基礎(chǔ)與組件

1.安裝腳手架 【CRA】
cnpm install -g create-react-app 
2.創(chuàng)建項(xiàng)目
create-react-app    projectname
3.啟動(dòng)項(xiàng)目
cnpm start           //啟動(dòng)
cnpm run build       //打包
4.項(xiàng)目目錄結(jié)構(gòu)
└── node_modules                    項(xiàng)目依賴目錄
├── public                              靜態(tài)公共目錄【不會(huì)被編譯壓縮打包,原樣輸出】
├── src                                   開發(fā)用的源代碼目錄
    - index.js              項(xiàng)目入口文件
    - index.css             項(xiàng)目全局樣式
    - App.js                項(xiàng)目最大的組件【類似根組件】
    - App.css               App組件的樣式文件
    - App.test.js           App組件測(cè)試文件 
    - logo.svg              初始項(xiàng)目的界面logo
    - serverWorker          內(nèi)部文件,我們不操作
├──.gitgnore                            項(xiàng)目git上傳忽略文件
├── package.json                    項(xiàng)目依賴配置記錄文件,記錄項(xiàng)目腳本命令
├── README.md                           使用方法的文檔
|-- config                項(xiàng)目webpack配置文件
|-- scripts               項(xiàng)目wepback腳本命令執(zhí)行文件
└── yarn-lock.json          鎖定安裝時(shí)的包的版本號(hào),保證團(tuán)隊(duì)依賴能一致
5. 入口文件【index.js】
import React from 'react'                           //JSX語(yǔ)法依賴
import ReactDOM from 'react-dom'            //React組件渲染到頁(yè)面上,是從react-dom中引入的
import App from './App';                            //引入根組件

ReactDOM.render(        //ReactDOM里render方法,把組件渲染成DOM樹,插入頁(yè)面元素中      
      <App/>,                                                       //組件名必須大寫
      document.getElementById('root')   //必須是DOM元素
    );
6.函數(shù)式組件【app.js根組件】
import React from 'react'                           //JSX語(yǔ)法依賴
import ReactDOM from 'react-dom'            //React組件渲染到頁(yè)面上,是從react-dom中引入的

const App = (props) => <h1>我的名字是{props.name}</h1>       

ReactDOM.render(                                            
    <App name="react" />                                
    document.getElementById('root')
)
export default App;     //導(dǎo)出組件

這樣一個(gè)完整的函數(shù)式組件就定義好了。但要注意!注意!注意!組件名必須大寫*,否則報(bào)錯(cuò)。

7.類組件【page/Home.js】
import React from 'react'                           //JSX語(yǔ)法依賴
import ReactDOM from 'react-dom'            //React組件渲染到頁(yè)面上,是從react-dom中引入的

class Home extends React.Component {
  render () {
    return (
      // 注意這里得用this.props.name, 必須用this.props
      <h1>歡迎進(jìn)入{this.props.name}的世界</h1>
    )
  }
}
ReactDOM.render(
  <Home name="react" />,
  document.getElementById('root')
)
export default Home;    //導(dǎo)出組件

功能復(fù)雜用類組件,功能單一用函數(shù)式組件

8.組件倆種樣式
1.行內(nèi)樣式
// 注意這里的兩個(gè)括號(hào),第一個(gè)表示我們?cè)谝狫SX里插入JS了,第二個(gè)是對(duì)象的括號(hào)
<p style={{color:'red', fontSize:'14px'}}>Hello world</p>
2.安裝第三方插件
cnpm i styled-components -D

import style from 'styled-components'
const container = styled.div`
        background:red;
`       
<container>
    內(nèi)容
</container>
9.組件組合和嵌套【建議用嵌套】
- 組件的嵌套式指: 將子組件在父組件的jsx中以標(biāo)簽的形式使用
- 組件的組合是指:將一個(gè)組件寫在另一個(gè)組件的內(nèi)容中,然后在外層組件中通過(guò) this.props.children來(lái)接收內(nèi)容中的組件
- 但是我們推薦大家后面寫的話可以使用嵌套
10.組件的數(shù)據(jù)

【屬性props】

屬性props不會(huì)輕易改變
1.外部屬性
在根組件的標(biāo)簽中添加屬性,在組件自身就能接收到,在自身中使用{this.props.xxx}就能輸出,如果有多個(gè)屬性,這可以在開頭先解構(gòu)this.props
const props=this.props

2.內(nèi)部屬性
在自身組件內(nèi)部添加以下代碼
static defaultProps = {
    name: 'React'   //屬性名:‘屬性值’
  }
有多個(gè)屬性,也需要解構(gòu)this.props

屬性驗(yàn)證

$ cnpm i prop-types -S
//需安裝第三方插件
1.引入 import propTypes from 'prop-types'

組件名.propTypes={
  屬性名:PropTypes.驗(yàn)證類型【sting...】
}

【狀態(tài)state】

跟組件一樣,寫在類class函數(shù)中,區(qū)別于屬性是可以變動(dòng),自己的狀態(tài)自己修改
state = {
    name: 'React',
  }
<h1>歡迎來(lái)到{this.state.name}的世界</h1>       使用方法也是先解構(gòu)在使用

方式二【官方推薦】
 constructor() {
    super()
    this.state = {
      name: 'React',
    }
  }

更改狀態(tài)

changeMsg=()=>{
this.setState({             
        msg:'新內(nèi)容'
})
}
//setState可以有兩個(gè)參數(shù),參1是數(shù)據(jù)修改的參數(shù),可是對(duì)象,也可以是回調(diào)函數(shù),參2是異步回調(diào)函數(shù)
<button onclick={this.changeMsg}>更改狀態(tài)<button
11.狀態(tài)提升
果有多個(gè)組件共享一個(gè)數(shù)據(jù),把這個(gè)數(shù)據(jù)放到共同的父級(jí)組件中來(lái)管理
12.受控組件與非受控組件
受控組件:父組件獲取數(shù)據(jù)傳參到子組件,子組件的數(shù)據(jù)都由父組件操控.
13.兩種事件的寫法
1.在組件內(nèi)使用箭頭函數(shù)定義一個(gè)方法(推薦)
2.直接在組件內(nèi)定義一個(gè)非箭頭函數(shù)的方法,然后在constructor里bind(this)(推薦)
14.事件傳參
在`render`里調(diào)用方法的地方外面包一層箭頭函數(shù)
15.表單用戶輸入
constructor(props){
  super(props)
  this.state={
     val:''                 
  }
}

changeVal=(e){
    const newval=e.taget.value
    this.setState({
        val:newval
    })
}

<input type="text" onkeyUp={this.changeVal}/> 
16.表單屬性問(wèn)題
Value->defaultValue    checked->defaultChecked
17.組件通信
1.父子組件通信
在父組件狀態(tài)state中定義數(shù)據(jù),子組件通過(guò){...this.state}解構(gòu)接收
2.子父通信
父組件定義一個(gè)方法,子組件通過(guò){this.方法}接收
子組件定義數(shù)據(jù),在自身中添加事件,將父組件方法外層包箭頭函數(shù),并解構(gòu)后傳入子組件自身的參數(shù)
3.非子父通信
先子父,再父子,以父為中間站傳遞數(shù)據(jù)
4.跨組件通信【爺傳孫通信】
首先在public中創(chuàng)建上下文
import {createContext} from 'react'
const MoneyContext = createContext(100)  //100是默認(rèn)值
exprot default MoneyContext

在爺組件中引入創(chuàng)建的上下文組件
用
const money=this.state
<MoneyContext.provider value={money}>
    <Father></Father>
</MoneyContext.provider>

在孫組件中進(jìn)入上下文
static contextType = MoneyContext
<p>爺爺給了我{this.context}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容