react基础文档

react

1. jsx语法规则
  • 样式类名要使用 className
  • 内联样式要使用 style={{key:value}} 示例:style={{color:'white',fontSize:'29px'}}
  • list循环 {data.map((item,index) => {return
  • {item.name}
  • })}
2.react中定义组件
  • 函数式组件: function MyComponent(){return

    函数式组件

    }
  • 类组件: class MyComponent extends React.Component {render()
3.组件实例props
  • 对标签属性进行类型、必要性的限制
static propTypes = {
    name:PropTypes.string.isRequired, //限制name必传,且为字符串
    sex:PropTypes.string,//限制sex为字符串
    age:PropTypes.number,//限制age为数值
}
  • 设置默认值、
//指定默认标签属性值
static defaultProps = {
    sex:'男',//sex默认值为男
    age:18 //age默认值为18
}
4.组件实例ref
  • 回调使用 ref={c => this.input1 = c } 使用 const value = this.input1.value
  • createRef方式 ref={this.myRef} 使用 myRef = React.createRef()
5.高阶函数-函数柯里化 存状态的表示受控组件
  • 通过传值方式,获取多个输入框输入得值,多个值存form对象中
<input onChange={this.saveFormData('username')} type="text" name="username" />
<input onChange={this.saveFormData('username')} type="text" name="username" />

state = {
    form: {
        username: '', //用户名
        password: '' //密码
    }
}

//保存表单数据到状态中  key接受的是状态key    event获取值  
saveFormData = (key) => {
	return (event) => {
		let form = this.state.form
		for (let item in this.state.form) {
			if (item === key) {
				form[item] = event.target.value
				this.setState({ form: form })
			}
		}
	}
}

//单个值
saveFormData = (dataType)=>{
    return (event)=>{
   		+this.setState({[dataType]:event.target.value})
    }
}
6.生命周期
  • 组件挂载完毕的钩子 componentDidMount(){}
  • 组件将要卸载的钩子 componentWillUnmount(){}
  • 组件更新完毕的钩子 componentDidUpdate(){}
7.脚手架创建项目
  • create-react-app my-project 注:不允许使用驼峰命名
8.跨域配置代理
1.在src下创建配置文件:src/setupProxy.js
2.setupProxy.js
const proxy = require('http-proxy-middleware')
module.exports = function(app) {
     app.use(
       proxy('/api', {  
         target: 'http://localhost:5000',
         changeOrigin: true, 
         pathRewrite: {'^/api': ''} 
       }),
       proxy('/api2', { 
         target: 'http://localhost:5001',
         changeOrigin: true,
         pathRewrite: {'^/api2': ''}
       })
     )
   }
9.路由组件 (pages)
  • 安装路由: npm i react-router-dom
    
  • 一般路由

    import {Link,Route} from 'react-router-dom'
    
    <Link to="/about">Home</Link>   to:去哪里
    
    <Route path="/about" component={About}/>  path:路由路径  component:引入路由组件
    
    //包裹
    import {BrowserRouter} from 'react-router-dom'
    <BrowserRouter><App/></BrowserRouter>,
    
  • NavLink

    可以通过activeClassName加鼠标点击得样式  .xxx{}
    
    import {NavLink,Route} from 'react-router-dom'
    
    <NavLink activeClassName="xxx" to="/about">Home</NavLink>
    
    <Route path="/home" component={Home}/>
    
  • 封装NavLink

    1. components下新建 MyNavLink文件
    
    2. MyNavLink.jsx
    import {NavLink} from 'react-router-dom'
    <NavLink activeClassName="atguigu" {...this.props}/>
    
    3.使用
    <MyNavLink to="/home">Home</MyNavLink>
    <Route path="/home" component={Home}/>
    
  • Switch

    import {Route,Switch} from 'react-router-dom'
    
    <Switch>
    	<Route path="/home" component={Home}/>
    	<Route path="/home" component={Test}/>
    </Switch>
    
    单一匹配
    
  • 解决样式丢失问题

    1. <link rel="stylesheet" href="/css/bootstrap.css">
    
    2. <link rel="stylesheet" href="%PUBLIC_URL%/css/bootstrap.css">
    
    3. 使用HashRouter
    
  • 路由的严格匹配与模糊匹配

    1.默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】,且顺序要一致)
    2.开启严格匹配:<Route exact={true} path="/about" component={About}/>
    3.严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由
    
  • Redirect的使用

    1.一般写在所有路由注册的最下方,当所有路由都无法匹配时,跳转到Redirect指定的路由
    
    import {Route,Redirect} from 'react-router-dom'
    <Route path="/home" component={Home}/>
    <Redirect to="/about"/>
    
  • 嵌套路由

    1.注册子路由时要写上父路由的path值
    2.路由的匹配是按照注册路由的顺序进行的
    
  • 路由组件传递参数

    • params参数

      路由链接(携带参数):<Link to='/demo/test/tom/18'}>详情</Link>
      
      注册路由(声明接收):<Route path="/demo/test/:name/:age" component={Test}/>
      
      接收参数:this.props.match.params
      
    • search参数

      路由链接(携带参数):
      <Link to='/demo/test?name=tom&age=18'}>详情</Link>
      
      注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>
      
      接收参数:this.props.location.search
      
      备注:获取到的search是urlencoded编码字符串,需要借助querystring解析
      
      import qs from 'querystring'
      const {search} = this.props.location
      const {id,title} = qs.parse(search.slice(1))
      
    • state参数

      路由链接(携带参数):
      <Link to={{pathname:'/demo/test',state:{name:'tom',age:18}}}>详情</Link>
      
      注册路由(无需声明,正常注册即可):<Route path="/demo/test" component={Test}/>
      
      接收参数:this.props.location.state
      
      备注:刷新也可以保留住参数
      
  • 编程式路由导航

    this.prosp.history.push()
    this.prosp.history.replace()
    this.prosp.history.goBack()
    this.prosp.history.goForward()
    this.prosp.history.go() + -
    
    push跳转+携带params参数
    this.props.history.push(`/home/message/detail/${id}/${title}`)
    
    push跳转+携带search参数
    this.props.history.push(`/home/message/detail?id=${id}&title=${title}`)
    
    push跳转+携带state参数
    this.props.history.push(`/home/message/detail`,{id,title})
    
    replace同
    
  • BrowserRouter与HashRouter的区别

    1.底层原理不一样:BrowserRouter使用的是H5的history API,不兼容IE9及以下版本。HashRouter使用的是URL的哈希值。
    2.path表现形式不一样BrowserRouter的路径中没有#,例如:localhost:3000/demo/test  HashRouter的路径包含#,例如:localhost:3000/#/demo/test
    3.刷新后对路由state参数的影响(1).BrowserRouter没有任何影响,因为state保存在history对象中。(2).HashRouter刷新后会导致路由state参数的丢失!!!
    4.备注:HashRouter可以用于解决一些路径错误相关的问题。
    
  • withRouter

    withRouter可以加工一般组件,让一般组件具备路由组件所特有的API
    withRouter的返回值是一个新组件
    
  • 9.redux没玩会
  • 10.扩展
    • lazyLoad const Login = lazy(()=>import('@/pages/Login'))

    • setState setState({},()=>{})

posted @ 2021-10-07 17:04  Smile浅笑  阅读(179)  评论(0编辑  收藏  举报