react语法以及基本使用

定义

facebook
meta 出品的一款构建javascript应用的库
单向数据流
组件
虚拟dom节点

安装与创建

安装:
npm i create-react-app -g
安装脚手架

create-react-app myreact
创建项目

cd /myreact
进入项目目录

npm start  启动项目
npm run eject  暴露webpack配置文件
npm run build 打包项目

jsx语法

javascript混合xml(html)语法格式
目的更好的在javascript中写html模板

特点:
1. 只有一个根节点
2. {} 写javascript
3. 数组可以直接写html标签
4. 对象样式自动展开
5. {/* 注释*/}
6. 类名用className

函数组件

无状态组件组件/
视图组件/

function App {
   return (<></>)
}
export default App;

类组件

有状态组件/
容器组件

import React,{Component} from 'react'

export default class App extends Component{
    render(){
        return(<></>)
    }
}

模板语法

1.文本渲染

文本渲染
{}

html文本渲染
dangerouslySetInnerHTML={{__html:xxx}}

2.条件渲染

三元运算符号
条件?<>:<>

&&符号
{{条件&&<>}}

3.列表渲染

this.state.list.map(item=><h3 key={item}>{item}</h3>)

事件

和普通js事件一致,需要驼峰式写法
onClick={this.sayHi}
onClick={()=>{this.sayHi(参数)}}
onClick={this.sayHi.bind(this,参数)}

更新状态

this.setState({k:v})
this.setState({k:v},()=>console.log("执行完毕的回调函数"))

dom节点引用

非受控表单

import {createRef} from ‘react’
this.inpRef = createRef()

<iput ref={this.inpRef}>

this.inpRef.current 获取节点

表单双向绑定

受控表单

<input value={this.state.msg} 
onChange={(e)=>this.setState({msg:e.target.value})}>

函数组件        类组件的区别

1.函数组件:

简单
props
建议多用

2.类组件

复杂
state状态
生命周期
props
this

react生命周期

挂载

constructor构造函数
static getDerivedStateFromProps
监听porps更新state
render渲染
componentDidMount
组件已经挂载

更新

static getDerivedStateFromProps
监听porps更新state
shouldComponentUpdate(nextProps,nextState){}
组件是否更新
render渲染函数
getSnapshotBeforeUpdate()
更新获取快照
返回的数据是 cdu 的第三个参数
componentDidUpdate
组件已经更新

卸载

componentWillUnmount
组件将要卸载

reactHook

在函数组件里面模拟生命周期和状态state

 useState使用状态

const  [num,setNum] = useState(10)

useEffect 模拟生命周期

第一个参数回调函数:模拟组件已经挂载完毕,组件更新完毕
第一个参数的返回值:模拟组件将要卸载
第二参数:依赖数据

useRef 使用Dom引用

const inpRef = useRef()
<input ref={inpRef}>
inpRef.current.value

useCallback 使用回调缓存
执行一个函数
useMemo使用缓存
(返回一个函数)
useLayoutEffect 视图发生变化
useReducer 集中数据管理器 (模拟reduce)
useContext 使用上下文(跨层级传参)
createContext 创建上下文

路由

安装 

npm i react-router-dom@5.0 -S

路由组件

BrowserRouter 浏览器路由
HashRouter 哈希路由

NavLink 导航链接

exact精确匹配
to 链接地址
class="active"
匹配状态

Route 路由容器

exact精确匹配
(路径和配置的path完全匹配)
path 路由地址
component 组件

<Redirect> 重定向

to 去哪儿
from 从那

<Switch> 匹配一个路由

<Prompt>
路由离开调用弹框

 when 当条件为真
message 弹出文本内容

<Link>
跳转

to=“/login”
to={{
pathname:"/login",
search:"name=mumu&age=18",
hash:"#good",
state:{redirect:"xxx"}
}}

参数 props里面的location一致的

404

1. Switch 包裹(一次匹配一个)
2. path=“*”
3. 配置放在最后面

路由的参数 

path="produce/:id”
切换 to=“/produce/abc”
获取:props.match.params.id

子路由

 

在主路由添加
  <div>
          <Route path="/admin/dash" component={Dash}></Route>
          <Route path="/admin/orderlist" component={OrderList}></Route>
          {/* 重定向 */}
          <Redirect path="/admin" to="/admin/dash"></Redirect>
       </div>

权限配置

<Private path="/admin">
    <Admin></Admin>
</Private>

function Private({children,...rest}){
    return <Route {...rest} render={({location})=>localStorage.getItem('isLog')?(children):<Redirect to={{pathname:"/",state:{redirect:location.pathname}}}>}></Route>
}

路由传参

params

<Route path="/produce/:id">
<Link to="/produce/abc">
props.match.params.id

state

传递
<Link to={{pathname:"/admin",search:"name=mumu&age=18",state:{redirect:"/admin"}}}>
获取state
props.location.state.redirect

search

路由props

 match
匹配的路由

params
路由的参数
isExact
是否精确匹配
path路径
url 地址

 history
历史记录

push 跳转
replace 替换历史记录
go跳转历史记录
goBack 返回
goForward 前进 
linsten 监听
location 同 location
length 长度

 location
地址栏信息

hash哈希值
pathname地址名称
search 查询信息
state跳转传入数据

只有 Route 对应的component才有这三个自动注入参数 

react代理 

安装:
npm i http-proxy-middleware

src目录
setupProxy.js

// 导入代理中间件

const { createProxyMiddleware } = require('http-proxy-middleware')
module.exports = function (app) {
    app.use("/member",
        createProxyMiddleware({
            target: 'http://www.520mg.com',
            changeOrigin: true
           
        })
    )
}

封装request

1. 导入

import axios from 'axios'
import qs from 'qs'

2. 创建

const request = axios.create({
  baseURL:"/",
  timeout:5000,
 headers:{post:{"Content-Type": "application/x-www-form-urlencoded"}}
})

3. 拦截

request.intercepters.request.use(function(config){},function(err){})

request.intercepters.response.use(function(res){},function(err){})

4. 扩展

request.jsonp = function(){}

5. 导出

export default request

api

//导入

import request from ‘xxx’
const login = (data,config)=>request.post(url,data,config)
export {login}

redux

全局状态管理器

 定义

import {createStore} from 'redux'

function reducer(store=0,action){
		switch action.type{
		case xxx:
		return {};
		default :
	}
}

const store = createStore(reducer);
export default store;

主要方法

store.getState()获取状态store

store.dispatch({type,val})发送事件action,执行reducer更新state
store.subscribe(()=>{})

监听store变化执行回调函数

异步

createStore创建仓库applyMiddleware处理插件
import icreateStore.applyMiddleware} from 'redux"
//导入异步中间件
import thunk from 'redux-thunk'
//创建仓库
const store = createStore(reducer,applyMiddleware(thunk));
定义异步方法
function GetUse(){
	return dispatch=>{
		dispatch()
	}
}
调用
GetUser()(store.dispatch)

antd

UI框架库

使用

1.安装
npm i and -S

2.导入css
@import '~antd/dist/antd.css';

3.使用
import {Button} form 'antd'
<Button></Button>

快速高效的使用

//组件有使用子组件

import {Select} form 'antd'
<Select.Option></Select.Option>

const {Option} = Select
<Option></Option>

组件的属性
    on开头是事件
其他属性
子组件属性

快速高效的使用

通常需要同ref一起使用
ref={this.inpRef}
this.inpRef.current.getFieldsValue()
可以获取到组件实例上面所有方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值