2019JAVA最新课程-React从入门到实战,新 - cascle

2019JAVA最新课程-React从入门到实战(新)

2019-12-24 11:44 cascle 阅读(650) 评论(0) 编辑收藏举报

React是一个库,通过react类,可以自定义组件。里边支持jsx语法,通过props和state传参/维护状态。

其他插件,比如Router/Redux都是围绕着扩展/修改react对象里的属性来添加功能的

1.准备工作

可以在yunp.top网站看webpack,node/npm,cnpm的相关使用视频教程

react有两种使用方式,一是在现有网站中添加;二是创建一个全新的

  官网创建全新一个react app步骤

  1.npx create-react-app my-app

  2.cd my-app

  3.npm start  

  (待定,熟悉react项目里的文件作用与架构)

2.JSX语法

  1.react类

  2.react-dom类

react-dom.render方法:两个参数。第一个是JSX语法写的标签(不是字符串或者对象),第二个是要插入的根容器标签

JSX语法:JavaScript + XML(HTML)结合形成的标签,包含了二者,可以在标签里直接用户js变量。遇到<>当XML语法解析,遇到{}当js语法解析

3.React元素渲染

():代表存在标签结构,并且标签结构要换行

所以可以用()代表一个要被渲染的元素,赋给一个变量,直接传到render方法里

ele = (<div>

hello react

</div>

)

ReactDOM.render(el, ...)

4.React创建组件

组件文件后缀,jsx(有提示)或者js

要引入react库才能创建组件

创建组件两种方法:类和hook

类方式:

class a extends react.Component{

render(){

    return <h1>hello react</h1>

  }

}

引用的时候,用<a />标签形式

5.组件Props属性

为组件复用

使用组件的时候,给组件标签属性赋值<Home navi={变量名}>(加花括号是因为这是jsx语法,navi=“数据”也行)

组件内部,通过this.pros.navi

props不可以被修改

6.事件处理

传统的方式,用双引号包起来的函数名改用{} 来包起来

 <a href="#" onClick={handleClick}>

类的方法默认不会绑定this,在类方法里使用this会未定义

三个办法解决:

1.调用bind方法

this.handleClick = this.handleClick.bind(this);

2.属性初始化语法

 handleClick = () => {
    console.log(\'this is:\', this);
  }

3.绑定的时候用lambda包起来

<button onClick={(e) => this.handleClick(e)}>

事件响应函数里加参数

两个办法

1.<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
2.<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>

7.组件状态

组件的状态用state属性存储

读:this.state.状态名

改变用this.setState({状态名:this.state.count 【operation】})方法

状态是为了不直接操作dom,在JSX里使用而提出的,面向数据,而不是DOM编程

8.组件生命周期函数

componentWillMount:在组件渲染之前执行

componentDidMount:在组件渲染之后执行

shouldComponentUpdate:是否应该更新

componentWillUpdate:数据修改之前

componentDidUpdate:数据修改之后

componentWillReceiveProps:props发生改变时执行

componentWillUnmount:组件卸载前执行

9.组件类的构造函数

constructor(props){

  super(props);

  this.state={count:10}//初始化state对象

}

10.props可以接受函数做属性,子组件可以调用回调到父组件方法,改变父组件的属性

11.setState可控的时候异步执行,不可控的时候同步执行

setState第二个参数是回调函数,在修改成功后调用

同步写法要结合Promise,async,await

12.条件渲染

1.视图切换;2.默认缺省值

? : 来放不同的JSX标签

13. 列表渲染 & key

<li>标签要有个key属性,即为map里的{index}

key的作用是局部刷新

14.表单受控组件

value的值通过state管理;非受控的自己搞dom管理

受控的,要给onChange事件设置响应函数,在响应函数里setState为e.target.value

事件.preventDefault:阻止提交改变网址

15.Refs & DOM

适用refs的情况

1.管理焦点,文本选择或媒体播放

2.触发强制动画

3.集成第三方dom库

通过React.createRef创建ref对象

ref.current既是当前DOM结点

16.表单非受控组件

当状态太多了,就不想自己管理状态。用非受控组件

通过current.value获取表单的值

17.状态提升:

父子组件间交换数据

把数据放在父组件,再通过props给子组件

18.组件组合

props.children获取组件标签下的子组件。在render函数里渲染的时候引用输出。

这种情况是在引用组件的时候,把其他组件或者标签放在组件里边

19.PropsType进行乐行检查

增强健壮性

要求组件的propTypes属性指定相应props的类型,比如propTypes = {title:PropTypes.string},PropTypes.string.isRequired代表这个属性一定要传

defaultProps对象指定相应属性默认值

20.ANTD UI

npm install后,引入相应组件,及其css或者less文件

根据官网文档使用,可以设置相应属性,尤其是回调函数

21.ANTD按需加载,引入js自动引入css

1.js与css单个文件导入

2.按照babel-plugin-import插件,配置antd

npm run eject(拉取webpack 配置)

安装插件,配置插件

22. Fetch get请求

fetch基于promise

fetch(url).then(res => {}).then().catch() ...,默认get

23.Fetch post请求

fetch(url, {method: "post", headers:{}, body:"body字符串",...})。body可以用querystring库(stringify方法)来处理

24.配置package解决跨域问题

开发环境:利用环境解决

生产模式:jsonp cors iframe postMessage

在package.json文件里,添加

"proxy":url字段

fetch的时候,可以不带url主机地址了

25.手动配置解决跨域问题

安装http-proxy-middleware

新建setupProxy.js,安装模板,修改目标网址

26.封装网络请求

api目录下 :

base.js:公共数据,配置

index.js:对外接口

util目录下:

封装fetch

27.React Router

安装:npm install react-router-dom --save

引入BrowserRouter,Switch,Route,Link 对象

使用Route标签,引入路径和组件的映射

<Route path="/home" compontent={Login}/>

每个Route标签,要被BrowserRouter标签包起来

这样就配置好了,在浏览器里输入/home,就跳到Login组件页面 。浏览器地址栏没有被映射的path,就不会显示相应的组件,即默认不显示相应的被映射的组件,一定要有个地方引用到这个path才可以,Route标签仅仅是为了占位,path被点击到了这个位置就显示

28.BrowserRouter和HashRouter区别

锚点记录与history push实现(需要后台处理重定向,否则404)

29.Link跳转

<Link to=path />,生成跳转标签。to还可以用对象配置

30.exact匹配

Route标签,父组件的exact={true}或者直接exact,表面不会显示路径里的父组件

31.strict匹配

Route加strict属性,表明地址里最后有个/也不匹配。必须和exact一起使用

32.组件可以直接倒出一个lambda匿名函数,里边render

33.Switch和404

Switch里面 放个Route,不配路径,全匹配。这样路径匹配不到,就显示这个组件

有了Switch标签,只会匹配一个,第一个匹配到的

34.render func

直接在Route标签里设置,render={lambda}

35. NavLink高亮

选中后高亮标签,class为active。可以通过属性activeClassName改变class名称。属性activeStyle指定具体样式

36.URL参数

定义路由的时候,加/:id,在使用的时候,用props.match.param.id获取。/:id代表,表明参数可有可无

37. query string读取参数

&分隔的在props.location.search里,待用URLSearchParams.get(key)来获取

或者用querystring.parse获取

38.Link的to属性

search添加&格式的参数,hash添加hash后缀,state为隐形参数,不在网址上暴露。props.location里包含这几个属性

39.重定向

不同路径,同一个页面

<Redirect>标签from知道src,to指定dst

40.重定向push和replace

使用props.history的push和replace方法进行页面跳转

41.withRouter

这是一个高阶组件

组件想被Router管理,获取props里相应的Router对象,导出的时候可以用withRouter(组件)的格式

42.Prompst

类似状态守卫,在某个状态的时候弹出文字,属性when是状态,message是提示文字

43.路由嵌套

在父组件里,通过props.children显示被嵌套进来的子路由组件。即组件组合的情况

44.redux介绍

redux是一个Javascript状态容器,提供可预测化的状态管理

传统状态共享:

props,回传事件

兄弟之间共享:共同的父/子元素

45.Boot CDN加载

取boot cdn这个网站搜

46.引入Redux

npm install --save-dev redux,或者npm install --save-dev react-redux。这二者一个是给js用的,一个是给react封装好使用的

Ruedx通过reducer定义,存储状态。外界通过dispatch action改变state,通过getState获取状态

1.从redux引入createStore

2.定义reducer,为一个函数,有两个参数,state和action

3.createStore(reducer)创建store

4.store里的dispatch分发,参数是一个对象,{type:"Incremeant", }

5.store还有getState和subscribe,通过subscribe返回的函数注销监听器

目前一个store只有一个state

47.mapStateToProps

用<Provider>标签包住要渲染的标签,提供其store属性为createStore返回值

被包住的组件,要使用connect对象,用高阶组件的形式export connect()(组件)

connect里的参数,可以是个lambad函数,将state映射到counter,返回一个对象,key为props名value为state值,这样在this.prpos.key就可以读到了

45.dispatch

connect的第二个参数是mapDispatchToProps,一个lambda函数,返回的对象是动作到方法的映射。通过传进来的dispatch参数,调用自定义方法

这样props里,就有了相应的方法。

dispatch的是action,里面包含了给reducer的各种参数

46.bindActionCreators

在dispatchToProps里通过给binderActionCreators传参,参数是导入的*和dispatch,即可一次导入,这样直接引用props.key即可

47. 传参给reducer,可以在action对象里拿到。action方法里返回的是一个对象

48.combineReducers,合并reducers

把reducer扔进combineReducer,要使用引用的话,加一层,props里state.reducer来引用

49.中间件

引入appMiddleware

createStore第二个参数即是appMiddleware,里边自定义lambda函数。

这是一个截获过程,可以获取执行过程中的状态。所以要有骨架,执行返回正常流程

中间件名 = store => next => action =>{

result = next(action)

return result

}

50.logger中间件

npm install --save-dev redux-logger

可以打印整个过程里的action,state,并且带颜色

50.第三方thunk中间件

thunk中间件负责异步

npm install --save-dev redux-thunk安装

有了这个中间件,可以在timeout里调用dispatch

thunk另一个异步作用是网络请求

网络请求后调用dispatch

thunk请求三种状态

1.请求中

2.成功

3.失败

state操作三大原则:

state是只读的

52. 调试工具

chrome安装插件

React Developer Tools

Redux DevTools

需要安装依赖,npm install --save-dev redux-devtools-extension

使用的时候,传参给createStore第三个参数位;或者composeWithDevTools包裹插件传进第二个参数位

53.React进阶-组件优化

1.定时器,网络请求,事件监听,在组件销毁前要取消

2.shouldComponentUpdate两个参数,nextProps,nextState,可以用来判断和当前的值是否一致,决定是否渲染

3.PureComponent,对数据进行浅比较。比较props,变化才渲染

54.Fragment

Fragment标签,用来占位,防止没有root对象

55.Context

组件第一个参数是props,第二个是context。父组件设置context,下面多层的子组件可以直接使用

父元素实现函数getChildContext返回键值对

父元素设置childContextTypes

子元素设置conTextTypes

56.高阶组件

1.是个函数

2.参数一个组件

3.返回值一个组件

在对传入的组件进行一次加工

高阶组件定义()=》(){}

使用,()()

57.错误边界处理

一个组件出错,仅仅这一个组件不显示出来

定义一个组件,componentDidCatch,参数为error,errorInfo

用这个组件包住可能出现错误的组件

58.新特性 state hook

hook:不写class的情况下去操纵state和其他数据

直接写个function,return一个jsx语法

可以 export default () =>{}直接导出

要使用state,

1.import useState

2.定义一个数组, [count,setCount] = useState(0)//0表示默认值

3.直接使用count和setCount,不用this

可以看到,简单了很多

59.Effect Hook

useEffect代替生命周期函数

有三个:componentDidMount.componentDidUpdate,componentWillUnmount

useEffect传入箭头函数即可。

useEffect第二个参数是个数组,[]代表映射componentDidMount。没有第二个参数,代表componentDidMount,componentDidUpdate.

useEffect直接返回代表componentWillUnmount

[count]代表只有count更新,才会调用componentUpdate

60.hook使用好处

可以返回一个对象, 里边是相应的值和事件响应函数

使用的时候,{...hook返回值}即可

awesome react hooks可以找到很多这种常用代码段,方便复用

61.useEffect优化

在回调函数里判断属性是否改变,决定是否渲染

62.网络请求hook下

可以用async await来做,封装为一个lambda

63.hook使用规则

不要在循环,条件,嵌套函数里使用hook

hook函数(userEffect,useStatge必须在顶层,所有的东西在他里面)

64.componentWillUnmount

return的时候做收尾工作,return一个lambda

65.memo

memo是个高阶组件,对于hook形式的组件,放进去再返回即可。和PureComponent一个作用

66.useCallback优化

包裹住回调函数,只在第二个参数变化的时候调用(除了第一次回调)

67.useReducer

通过useReducer返回state和dispatch,改变state通过调用dispatch

68.useContext

React.createContext创建context

子组件用创造context.Provider标签,指定value

子组件可以使用useContext(context)来获取

69.contextType

使用useContext后,子类指定statci contextType,就可以直接用this.context

70.setState

可以传一个lambd函数,prevState和props为参数

合并所有的异步执行,异步执行完毕后执行回调函数

y