声明式: jsx 与html标签相似,是mvc层的v层
基于组件:
应用广泛:web, vr ,安卓,苹果
两个库
react:基础核心,创建元素,组件功能
react-dom:提供Dom库(适用于web开发)
作用:
配置环境(打包环境,编译测试等)
导入一些必要的库如:react/react-dom
命令:
npx creat-react-app 项目名
npx的好处是可以避免全局安装脚手架等,直接调用
表达式:{表达式(js代码段)}
驼峰式:class->className,for->htmlFor,tabindex->tabIndex
条件渲染:根据值的不同,生成不同的jsx,常用if/else,三元表达式,&运算
列表渲染:用循环,for,map等生成jsx列表子选项,(添加key)
样式渲染:1行内样式,2className控制css类选择器
组件的优势是逻辑控制,jsx等独立,即有独立的作用域,所以有类和函数两种方式
注意:
fuction 组件名大写(){
return (jsx||null)
}
类组件:(有状态)
class 组件名大写 extends React.component(){
render(){
return (jsx||null)
}
}
使用时:ReactDom.render(组件,挂载点)
state用于储存会变化的值
setState用来改变state,这样react才会知道state发生改变,重新调用render,参数是一个state的子集。
class Hello extends React.component(){
constructor(){//方法1
super()
this.stats={count:0}
}
state={count:0}//方法2 es6增加属性的简化写法
render(){
return <div>Hello的count:{this.state.count} </div>
}
}
受控组件: 即通过setState的形式控制输入的值及更新,
非受控组件: 即通过dom的形式更新值,要获取其值可以通过ref的形式去获取。
是否受控,看是否受setState()的控制
受控组件,value=this.states.属性,为了在刷新视图时显示,onChange调用setState函数,修改后state改变,react刷新。
此方法的缺点是,一个表单调用一个函数,为了复用,将state对应属性的属性名赋给input等表单,通过【target.name】取出发生变化的表单name,再作为setState函数的{【name】:value}参数,value也取自target,由于不同表单空间的value储存位置不同,所以
先判断类型,后取值。
非受控组件:react类(类组件才有状态state)的构造函数中新建一个ref对象,将标签的ref绑定这个对象,通过this.ref对象.current。value即可获取值
方法1,是层层父子传递,但是太过麻烦。
方法2,是用context
const {Provider, Consumer} = React.createContext(defaultValue);
<Provider value={/*共享的数据*/}>
/*里面可以渲染对应的内容*/
</Provider>
<Consumer>
{value => /*根据上下文 进行渲染相应内容*/}
</Consumer>
便于理解,画了一个图
三个字找叔叔,让父子层次少的传递,这样不用层层传递了
只需要记录传递每个组件的setState()和要传的参数即可实现任意组件间传递
钩子函数,react类在创建,挂载,更新,和销毁规程中,会调用相应的钩子函数。
对于父子组件的生命周期,总结来说就是递归的,参考二叉树
生命周期函数(有序)
constructor()
componentWillMount()
render()
componentDidMount()
创建
componentWillReceiveProps (nextProps)
getDerivedStateFromProps(nextProps, prevState)
shouldComponentUpdate(nextProps,nextState)
componentWillUpdate (nextProps,nextState)
getSnapshotBeforeUpdate(prevProps, prevState)
render()
componentDidUpdate(prevProps,prevState)
更新(props改变,this.setState,this.forceUpdate())三种情况会更新(不要或者有条件的使用上述三种情况,避免无限递归调用)
componentWillUnmount ()删除定时器等打扫收尾
销毁
本质都是将props的内容替换原有render函数,控制样式
异步调用:
组件更新,会更新自己和子组件,对父组件和兄弟组件不产生影响
渲染顺序是先序遍历 根-左-右
安装react-router-dom,然后导入browserouter(hashrouter),route,link三组件
其中browserouter(hashrouter)分别时history和hash模式。
要用来包裹应用(route和link),只能有一个。
< link to="/path">标题 link>会被编译成a标签,href=”/path“,其作用是点击后改变浏览器url
route 组件有两个属性,一个是path,另一个是绑定的组件。当浏览器url改变,就会遍历所有route标签,并在route位置渲染路径符合的组件。
匹配分两种,一种是默认的模糊匹配。简单来说就是包含且满足startwith即可。
另一种是精准匹配,route添加exate,要url完全相同才可匹配