react—1.react相關知識點
阿新 • • 發佈:2021-01-31
技術標籤:react+ant+ts+node入門到實戰開發react
1.react前期準備
建立react專案
npx create-react-app react-demo
cd react-demo
npm start
環境介紹
node_modules:非常大
public:入口檔案
src:原始碼檔案
2.react-jsx語法
jsx語法:javascript+xml語法(html)
解讀jsx語法:遇到<>,按照HTML語法解析,遇到{},按照Javascript解析
import React from 'react';
import ReactDOM from 'react-dom';
//document.getElementById('root') 獲取要插入的容器
//jsx語法:<h1>hello React</h1>
const react = "React"
ReactDOM.render(
<h1>hello {react}</h1>,
document.getElementById('root')
);
3.react-react元素渲染
():如果存在標籤結構,並且標籤結構要換行,需要用()括起來
function tick(){
const element = (
<div>
<h1>Hello,World</h1>
<h2>It is {new Date().toLocaleTimeString()}</h2>
</div>
)
ReactDOM.render(
element,
document.getElementById('root')
);
}
setInterval(tick,1000);
4.react-建立元件
元件的字尾可以是js,也可以是jsx
一個React專案,是由成千上萬元件組成
//Home.jsx
import React from 'react';
export default class Home extends React.Component{
render(){
return (
<div>
Home
</div>
)
}
}
//App.js
import React from 'react'
import Home from './Home'
//用類的形式建立元件
class App extends React.Component{
//渲染函式
render(){
return(
<div>
<h1>Hello React Component</h1>
<h3>學習react,最重要的是,心態要好</h3>
<Home/>
</div>
)
}
}
export default App;
import React from 'react';
import ReactDOM from 'react-dom';
import App from './app';
ReactDOM.render(
<App />,
document.getElementById('root')
);
5.react-props屬性
元件的複用性很重要
import React from 'react'
//props不可以被修改
export default class MyNav extends React.Component{
render(){
return (
<div>
<h3>{this.props.title}</h3>
<ul>
{
this.props.nav.map((element,index)=>{
return <li key={index}>{element}</li>
})
}
</ul>
</div>
)
}
}
import React from 'react'
import Home from './Home'
import MyNav from './MyNav'
//用類的形式建立元件
class App extends React.Component{
//渲染函式
render(){
const nav1 = ["首頁","視訊","學習"]
const nav2 = ["WEB","Java","Node"]
return(
<div>
<h1>Hello React Component</h1>
<h3>學習react,最重要的是,心態要好</h3>
<Home />
<MyNav nav = {nav1} title="路徑導航"/>
<MyNav nav = {nav2} title="學習導航"/>
</div>
)
}
}
export default App;
6.react-state狀態
import React from 'react'
export default class StateComponent extends React.Component{
/**
* 元件中的狀態state
* 以前我們操作頁面元素的變化,都是修改dom,操作DOM
* 但是現在有了React優秀的框架,我們不在推薦操作Dom,頁面元素的改變使用State進行處理
*/
constructor(props){
super(props);
this.state = {
count:10,
flag:true
}
}
increment(){
//setState
this.setState({
count:this.state.count+=1
})
}
decrement(){
this.setState({
count:this.state.count-=1
})
}
clickHandler= ()=>{
console.log(this)
}
render(){
const showView = this.state.flag ? '我是孫悟空':'我是假的孫悟空'
return (
<div>
<h3>元件的state</h3>
<p>{this.state.count}</p>
<button onClick = {this.increment.bind(this)}>增加</button>
<button onClick = {this.decrement.bind(this)}>減少</button>
<button onClick = {this.clickHandler}>關於this</button>
<p>{showView}</p>
</div>
)
}
}
import React from 'react'
import StateComponent from "./stateComponent";
class App extends React.Component{
render(){
return(
<div>
<StateComponent />
</div>
)
}
}
7.react-React元件生命週期函式
函式列表:
componentWillMount:在元件渲染之前執行的
componentDidMount:在元件渲染之後完成
shouldComponentUpdate:返回true和false,true表示允許改變,false表示不允許改變
componentWillUpdate:數在修改完成(state,props)據在改變之前執行(state,props)
componentDidUpdate:資料
componentWillReceiveProps:發生改變時執行
componentWillUnmount:元件解除安裝前執行
子傳父、父傳子:
import React from 'react'
export default class ComponentLife extends React.Component{
constructor(props){
super(props);
this.state = {
count:10
}
}
componentWillMount(){
console.log("componentWillMount")
}
componentDidMount(){
console.log("componentDidMount")
}
shouldComponentUpdate(){
console.log("shouldComponentUpdate")
return true
}
componentWillUpdate(){
console.log("componentWillUpdate")
}
componentDidUpdate(){
console.log("componentDidUpdate")
}
componentWillReceiveProps(){
console.log("componentWillReceiveProps")
}
componentWillUnmount(){
console.log("componentWillUnmount")
}
changeHandler = ()=>{
this.setState({
count:this.state.count+=1
})
}
clickChanges = () =>{
// console.log(this.props)
this.props.clickChanges('我是兒子的資料');
}
render(){
const {count} = this.state
return (
<div>
生命週期函式:{count}-{this.props.title}
<button onClick = {this.changeHandler} >修改</button>
<button onClick = {this.clickChanges} >修改title</button>
</div>
)
}
}
import React from 'react'
import ComponentLife from "./ComponentLife"
//用類的形式建立元件
class App extends React.Component{
constructor(){
super();
this.state = {
title:"文字1"
}
}
clickChange = (data)=>{
// this.setState({
// title:"文字2"
// })
this.setState({
title:data
})
}
//渲染函式
render(){
return(
<div>
<ComponentLife title={this.state.title} clickChanges = {this.clickChange} />
<button onClick = {this.clickChange} >修改title</button>
</div>
)
}
}
export default App;
8.react-setState是同步還是非同步
1.setState會引起檢視的重繪
2.setState在可控元件中是非同步的,在不可控元件中是同步的
import React from 'react';
export default class SetStateDemo extends React.Component{
constructor(){
super();
this.state = {
count:0
}
}
async increment(){
// this.setState({
// count:this.state.count+=1
// },()=>{
// console.log(this.state.count)//1
// })
// console.log(this.state.count);//1
await this.setStateAsync({count:this.state.count+1});
console.log(this.state.count)
}
setStateAsync(state){
return Promise((resolve)=>{
this.setState(state,resolve)
})
}
render(){
return(
<div>
setState同步還是非同步問題
<p>{this.state.count}</p>
<button onClick={this.increment.bind(this)}>修改</button>
</div>
)
}
}
9.react-react條件渲染
import React from 'react'
export default class IfDemo extends React.Component{
/**
* 常用的應用場景:
* 1.對檢視條件進行切換
* 2.做預設值
*/
constructor(){
super();
this.state = {
isLogin:false,
names:["ime"]
}
}
clickHandler = ()=>{
this.setState({
isLogin:true
})
}
render(){
const {names} = this.state;
let showView = this.state.isLogin?
<div>iwen</div>:
<div>請登入</div>
return (
<div>
條件渲染:{showView}
<button onClick={this.clickHandler}>登入</button>
{
names.length > 0 ?
<div>
{
names.map((element,index)=>{
return <p key={index}>{element}</p>
})
}
</div>
:
<div>請等待資料正在請求...</div>
}
</div>
)
}
}
10.react-react列表渲染
import React from 'react'
export default class KeyDemo extends React.Component{
constructor(){
super();
this.state = {
userinfo:[
{
name:'iwen',
age:20,
sex:"男",
jobs:['11','222','333']
},
{
name:'ime',
age:20,
sex:"男",
jobs:['11','222','333']
},
{
name:'frank',
age:20,
sex:"男",
jobs:['11','222','333']
}
]
}
}
clickHandler = ()=>{
this.setState({
userinfo:this.state.userinfo.concat([{
name:'sakura',
age:30,
sex:"女",
jobs:['333','444','555']
}])
})
}
render(){
return (
<div>
<ul>
{
this.state.userinfo.map((element,index)=>{
return(
<li key={index}>
<span>{element.name}</span>
<span>{element.age}</span>
<span>{element.sex}</span>
<div>
{
element.jobs.map((childElement,childIndex)=>{
return <span key={childIndex}>{childElement}</span>
})
}
</div>
</li>
)
})
}
</ul>
<button onClick={this.clickHandler}>增加</button>
</div>
)
}
}
11.react-react表單受控元件
使react的state成為唯一資料來源,渲染表單的react元件還控制著使用者輸入過程中表單發生的操作,被react以這種方式控制取值的表單輸入元素就叫做"受控元件"
import React from 'react'
export default class FormDemo extends React.Component{
constructor(){
super();
this.state = {
value:""
}
}
handleSubmit = (e)=>{
e.preventDefault();
console.log(this.state.value);
}
onChangeHandler=(e)=>{
this.setState({
value:e.target.value
})
}
render(){
return(
<div>
<form onSubmit = {this.handleSubmit}>
<input type="text" value={this.state.value} onChange={this.onChangeHandler}/>
<input type="submit" value="提交"></input>
</form>
</div>
)
}
}
12.react-React Refs&DOM
ref可以通俗的理解為v-model
ref使用的地方:
管理焦點,文字選擇或者媒體播放
觸發強制動畫
整合第三方DOM庫
import React from 'react'
export default class RefsAndDOM extends React.Component{
constructor(){
super();
this.HelloDiv = React.createRef();
}
componentDidMount(){
this.HelloDiv.current.style.color = 'red'
}
render(){
return(
<div>
Refs和DOM
<div ref = {this.HelloDiv}>
Hello
</div>
</div>
)
}
}
13.react-react表單非受控元件
import React from 'react'
export default class RefsForm extends React.Component{
constructor(){
super();
this.username = React.createRef();
this.password = React.createRef();
}
clickHandler = (e)=>{
console.log(this.username.current.value)
console.log(this.password.current.value)
}
render(){
return (
<div>
<input type="text" ref={this.username}/>
<input type="text" ref={this.password}/>
<button onClick={this.clickHandler}>提交</button>
</div>
)
}
}
14.react-狀態提升
元件之間的資料互動
//parent.jsx
import React from 'react'
import Child1 from './child1'
import Child2 from './child2'
export default class Parent extends React.Component{
constructor(){
super();
this.state = {
money:7
}
}
changeHandler(e){
this.setState({
money:e.target.value
})
}
render(){
return(
<div>
<input type="text" value={this.state.money} onChange={this.changeHandler.bind(this)}/>
<p>Parent</p>
人名幣:<Child1 money={this.state.money}/>
美元:<Child2 money={this.state.money}/>
</div>
)
}
}
//child1.jsx
import React from 'react'
export default class child1 extends React.Component{
constructor(){
super();
this.state = {
input1:0
};
}
componentDidMount(){
console.log(this.props.money)
this.setState({
input1:this.props.money
})
}
changeHandler(e){
this.setState({
input1:e.target.value
})
}
render(){
return(
<div>
<p>{this.props.money}</p>
<input type="text" value={this.state.input1} onChange={this.changeHandler.bind(this)}/>
</div>
)
}
}
//child2.jsx
import React from 'react'
export default class child2 extends React.Component{
constructor(){
super();
this.state = {
input2:0
};
}
componentDidMount(){
this.setState({
input2:this.props.money*7
})
}
changeHandler(e){
this.setState({
input2:e.target.value
})
}
render(){
return(
<div>
<p>{this.props.money*7}</p>
<input type="text" value={this.state.input2} onChange={this.changeHandler.bind(this)}/>
</div>
)
}
}
15.react-元件組合
this.props.children(元件組合可以類比vue,是插槽)
//Compose
import React from 'react'
export default class Compose extends React.Component{
render(){
return(
<div>
哈哈哈:{this.props.children}
</div>
)
}
}
import Compose from './compose'
function App() {
return (
<div className="App">
<Compose>
<div>我是組合效果</div>
</Compose>
</div>
);
}
export default App;
16.react-React PropsType驗證
增強程式的健壯性
import React from 'react'
import PropTypes from 'prop-types';
export default class PropsTypeDemo extends React.Component{
render(){
return(
<div>
Hello:{this.props.title}
</div>
)
}
}
PropsTypeDemo.propTypes = {
title:PropTypes.number.isRequired
}
// PropsTypeDemo.propTypes = {
// title:PropTypes.number
// }