react
这里先介绍react 由于公司内部技术栈主要为vue,本文主要是向公司内部实习生简单科普react自己编写的简单资料
一些在线资源,用于html引入,快速体验react
<!-- react-->
<script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
<!-- ReactDOM-->
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
<!-- babel-->
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<!-- PropTypes-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/prop-types/15.6.0/prop-types.js"></script>
jsx语法
有点像js和xml结合混写,简单的理解react支持在js里面直接写html,有自己的语法规范去解析,比如遇到 < 这个标签它就用html规则去解析了,如果遇到 {} 就用js去解析
var test='解析我吧,我是个变量'
ReactDOM.render(
<p>{test}</p>, document.getElementById('app')
)
值得注意的是在react里面的一些小规范
1.自定义组件<App> 大写开头
2.class=>className onclick=>onClick for=>htmlFor (主要是一个关键字)
3.组件外面包裹一层,你可以用Fragment也可以用常用的标签,这个就跟vue template,angular的 ag-container一样
渲染ReactDOM.render
ReactDOM.render 是 React 的最基本方法,用于将模板转为 HTML 语言,并插入指定的 DOM 节点。
ReactDOM.render(
<p>我是呗插入的模板组件</p>, document.getElementById('reactId')
)
组件类型
函数式组件
<div id='reactId'></div>
function ReactCom(){
return <div>函数式组件</div>
}
ReactDOM.render(<ReactCom/>,document.getElementById('reactId'))
类式组件
<div id='reactId'></div>
class ReactCom extends React.Component{
render(){
return (<div>类式组件</div>)
}
}
ReactDOM.render(<ReactCom/>,document.getElementById('reactId'))
react核心
state
-
state值对象
-
setState更改state
-
方法中的this可用bind(this),或者箭头函数,建议箭头函数
-
类式组件constructor大部分情况下均可省略
class ReactCom extends React.Component{ // constructor(props){ // super(props) // this.state={ // flag:'我是state', // } // } //简写 state={ flag:'我的state' } render(){ return <div onClick = {this.handelClick}>{this.state.flag}</div> } handelClick=(e)=>{ this.setState({ flag:'我是state'+1 }) } } ReactDOM.render( <ReactCom />,document.getElementById('reactId'))
props
- 外部给组件传递数据
- props只读,不允许改,(外部传入的数据单向数据流)
类似组件使用props
class ReactCom extends React.Component{
//限制传递数据的rule,通过PropTypes库
//现在类似以及必传
static propTypes={
// name:React.PropTypes.string //已废弃,已从React上移除
propsName:PropTypes.string.isRequired
}
//限制默认值
static defaultProps={
propsName:'默认值'
}
render(){
console.log(this)
return <div>{this.props.propsName}</div>
}
}
let person={
name:'张三',
sex:'男'
}
ReactDOM.render(<ReactCom person={person}/>,document.getElementById('reactId'))
函数组件使用props,利用函数传参
function ReactCom(props){
console.log(props)
return <div>{props.propsName}</div>
}
//限制传递数据的rule,通过PropTypes库
//现在类似以及必传
ReactCom.propTypes={
// name:React.PropTypes.string //已废弃,已从React上移除
propsName:PropTypes.string.isRequired
}
//限制默认值
ReactCom.defaultProps={
propsName:'默认值'
}
let person={
name:'张三',
sex:'男'
}
ReactDOM.render(<ReactCom person={person} propsName='默认值'/>,document.getElementById('reactId'))
refs
-
官方说字符串形式的ref已过时,未来会被移除,存在性能问题
-
回调函数的ref
-
createRef的ref,建议
class ReactCom extends React.Component{ refCreate=React.createRef();//推荐的ref方式 render(){ return ( <div onClick={this.handelClick}> <span ref='refFlag'>字符串的ref</span> <span ref={e=>{this.refCallback=e;console.log('///',e)}}>回调函数的ref</span> <span ref={this.refCreate}>createRef</span> </div> ) } handelClick=()=>{ console.log('字符串的ref',this.refs) console.log('回调函数的ref',this.refCallback) console.log('createRef的ref',this.refCreate) } } ReactDOM.render(<ReactCom></ReactCom>,document.getElementById('reactId'))
react事件绑定
-
onXXXX什么格式绑定事件,react自身重新封装了
-
注意绑定事件的this指向
class ReactCom extends React.Component{ render(){ return <div onClick={this.handelClick}>事件绑定</div> } handelClick=(e)=>{ console.log(e,this) } } ReactDOM.render(<ReactCom></ReactCom>,document.getElementById('reactId'))
react条件渲染
class ReactCom extends React.Component{
render(){
if(false){
return <div>条件渲染</div>
}
return <div>false</div>
}
}
ReactDOM.render(<ReactCom></ReactCom>,document.getElementById('reactId'))
react列表渲染
*注意key
class ReactCom extends React.Component{
state={
list:[{
id:1,
name:1,
sex:1
},{
id:2,
name:2,
sex:2
}]
}
render(){
let list=this.state.list.map((e)=>
<li key={e.id}>{e.name}-{e.sex}</li>
)
return <div>{list}</div>
}
}
ReactDOM.render(<ReactCom></ReactCom>,document.getElementById('reactId'))
表单
-
受控组件 以state中的状态管理表单 官方建议
-
非受控组件 以自身dom节点中的数据管理表单
// 受控组件例子,推荐 class ReactCom extends React.Component{ state={ username:'2', password:'3' } render(){ return ( <div> username:<input value={this.state.username} name='username' onChange={this.handelChange}></input> password:<input value={this.state.password} name='password' onChange={this.handelChange}></input> <button onClick={this.handelClick}>提交</button> </div> ) } handelChange=(e)=>{ console.log(e.target) this.setState({ [e.target.name]:e.target.value }) } handelClick=()=>{ alert(this.state.username+'-'+this.state.password) } } ReactDOM.render(<ReactCom></ReactCom>,document.getElementById('reactId'))
生命周期
组件的生命周期
初始化阶段
constructor
componentWillMount
render
componentDidMount //常用
更新阶段
shouldComponentUpdate
componentWillUpdate
render
componentDidUpdate
卸载阶段
componentWillUnmount //常用
css
css
className class是个关键字,react中很多因为关键字而自己重新封装了api
css模块防止污染,或者利用less,sass
xxx.module.css
import style form './xxx.module.css'