当前位置:网站首页 > React Native移动开发 > 正文

react组件必不可少的函数(react 函数组件)



在定义React组件的时候,render()函数返回的html必须只有一个根元素,要想这个根元素不显示并且不占据页面空间,可以从react中引进Fragment组件

 

JSX语法细节

在JSX里面写注释的方法:

属性:dangerouslySetInnerHTML={{_html: item}}可以让内容item不转义,直接显示

属性class写成className属性for写成htmlFor

 

<lable  htmlFor='inputId'></lable>标签用于扩大输入框的范围,点击文字的时候,光标定位到input输入框

<input  id='inputId'/>

 

PropTypes与DefaultProps的应用

PropTypes接受组件传过来的参数时,对参数类型做校验

通过下面的语句引进PropTypes,通过脚手架create-react-app已经有prop-types包,所以可以直接引进

defaultProps即对组件接收的参数赋予默认值,如果父组件没有给子组件传递该参数的值,则子组件使用默认值

 

state、props与render()函数的关系

当state、props中的属性的值发生变化的时候,render()函数重新执行,即当数据一变,就会调用render()函数,重新渲染页面,从而改变页面,达到数据一变,页面就会变

子组件的render()调用时机:当子组件的props或者state属性发生变化时调用render()函数,或者父组件的render()调用时,子组件的render()会调用

 

虚拟DOM------就是一个JS对象,用来描述真实的DOM

在React中,虚拟DOM的操作不怎么耗性能,实际是操作真实的DOM比较耗性能,比较新旧虚拟DOM的差异(使用diff算法),找到差异的地方,直接更新变化的DOM

虚拟DOM的优点:

1)性能提升,真实DOM的比对变成虚拟DOM的比对

2)它使得跨端应用得以实现。React Native

虚拟 DOM中的diff:同层比较,在用列表表示的时候,key的值最好不用index,使得不变的元素的新旧key值一样,从而提升性能

setState(对象/异步func(prevState),func---当第一个异步函数操作完之后就执行该函数):异步函数是为了将多次间隔较短的虚拟DOM的变化,合并成一次虚拟DOM的变化,提高性能

 

JXS中的tag中的属性ref的值是一个函数,用于获取DOM,但在实际中不推荐使用该属性获取该元素,因为React中是数据驱动,不推荐直接操作DOM 

 

React中的生命周期函数---指在某一时刻会自动执行的函数

initialization---组件初始化

 mounting----组件挂载(只执行一次)

updation---组件更新(数据发生变化,props   state)

unmounting---组件卸载

shouldComponentUpdate 的返回值是boolean类型,用来判断是否需要调用 render 方法重新描绘 dom(返回true值)。

因为 dom 的描绘非常消耗性能,如果我们能在 shouldComponentUpdate 方法中能够写出更优化的 dom diff 算法,可以极大的提高性能

 

 

 

生命周期函数的使用场景

在定义组件的时候,一定要书写render()函数,因为React内置了除了render()函数之外的所有生命周期函数

1)ajax请求放在componentDidMount()中,该函数只执行一次

 

使用charles实现本地数据mock,使用axios方法

 

使用css的transition,animation实现简单动画,或者使用react第三方插件react-transition-group实现用js实现的动画

<CSSTransition>组件实现单个组件的动画

<TransitionGroup> + <CSSTransition>实现多个组件的动画

 

 

React是一个简单的视图层框架

Redux = Reducer + Flux:是一个数据层框架,主要方法是createStore(redux)和store.dispatch(action),store.subscribe(event)

Flux是一个辅助React的数据层框架:存在的问题是可以有很多个store,造成数据存储存在依赖的问题

有了Redux之后,将组件的数据存储在Store里面,当组件的数据发生变化,Store里面的数据发生变化,然后接着改变其他组件的数据

 

Antd(用于快速构建后台界面用的,前端UI用的较少)或者、semantic-ui-react是用于构建React UI 的插件

 

首先在项目中安装redux,redux在chrom中的调试插件redux devtools

创建reducer

1)在src/store/reducer.js文件里面定义reducer(相当于一个记录本,里面定义state的默认值,然后必须返回一个函数)

2)在src/store/index.js文件里面定义store

3)component连接store

4)在浏览器中安装调试redux的插件redux devtools,然后在组件中需要进行如下配置

在创建store的地方进行如下配置

5)在React Component中定义action,并且将action分发给store对象

6)store接收到action之后,自动将接收到的action和store中之前的数据传给reducer,这时候需要在reducer里面根据action做相应的处理,将处理完之后的newState返回给store 对象

7)store接收到reducer处理之后返回的newState。这时候需要用newState替换掉component中的state数据

利用store.subscribe(event)订阅一个事件event,event用于更新component中的state数据

8)component中的state数据更新了,现在需要点击按钮时,将新增的数据添加到数组里面,而现在所有的数据都放到了store对象里面,即点击按钮的时候,需要改变的是store对象中的数据

在组件上面定义事件,在事件里面定义action,并通过store.dispatch(action)传递给store对象

9)store对象接收到action,就自动触发reducer根据action做相应的处理,处理完后将newState返回给store对象

10)store对象接收到newState,由于之前在component中的constructor中已经订阅事件store.subscribe(this.handleStoreChange);通过handleStoreChange修改组件的state,所以已经达到点击按钮,向数组添加数据的目的

 

点击具体的item的时候将其删除掉

1)在组件上面绑定事件,并且向事件传递index参数

2)在事件里面定义action,通过store.dispatch(action),将动作传递给store对象

3)此时store接收到action,并将store中的state和action一起传给reducer,reducer执行相应的action,返回newState给store对象,由于之前在component的constructor中通过store.subscribe(event),在event中通过store.getState()重新对component的state赋值,达到删除功能

 

ActionTypes的拆分

解决的问题:当action.type拼写错误,但在浏览器没有报错也没有提示任何信息,为了解决这个问题将ActionTypes在一个文件夹里面定义成常量,然后输出。当书写错误的时候,浏览器会报错

1)在src/store下新建文件actionTypes.js,内容如下

2)在组件里面引进该对象,然后将action里面的type换成上述文件定义成的常量变量

同时在reducer中将action.type也换成定义的常量变量

 

使用actionCreator统一创建action,便于管理,提高代码的可读性,便于自动化测试

1)在src/store下面创建文件actionCreators.js

 

2)在组件引入action

3)在组件中使用action

redux的3个基本原则

1)store对象必须是唯一的,在src/store/index.js中定义

2)只有store能够改变自己的内容(reducer根据action进行相应操作后,将newState返回给store,store将自己的内容更新,所以不能在reducer里面直接修改state的内容)

3)reducer必须是纯函数(固定输入,固定输出,并且不会有任何副作用---例如不会修改传入参数的值)

 

redux的核心API

 

UI组件(展示型组件)与容器型组件的拆分

UI组件负责页面的展示,数据通过容器型组件传过来,通过props拿到数据;在TodoListUI.js里面只有render()函数里面直接返回JSX;

容器性组件TodoList.js负责页面的逻辑

 

Redux中发送异步请求获取数据----

在componentDidMount()中发送ajax请求,拿到数据后给store传递action

 1)在项目中安装axios插件

2)在容器型组件中引进axios

3)在componentDidMount()中定义action,并将action传递给store

接着在reducer中根据action.type进行操作

 

 

发使用redux-thunk中间件实现ajax数据请求

--------为了将异步请求和复杂的逻辑抽取出来,将代码放到一个统一的文件,便于统一管理

redux-thunk中间件可以把异步请求和复杂的逻辑放到action里面处理

在项目中安装redux-thunk,根据官网例子书写代码   https://github.com/reduxjs/redux-thunk    链接

1、在创建store对象的index.js文件做如下修改:对redux-thunk进行配置
 

2、对redux-thunk进行配置好后,可以将异步操作放到action里面进行操作

在src/store下面创建文件actionCreators.js中使用了中间件redux-thunk,那么创建的action可以返回函数,而不仅仅是返回一个对象,在返回的函数里面进行异步操作

3、在组件的componentDIdMount()中调用上述函数,从而得到action

 

redux中间件---处理异步事件

redux中间件指的是Action和Store之间的中间件

中间件指的是对dispatch方法的升级,使得该函数的参数除了是对象之外还可以是函数

可以用redux-thunk对dispatch升级

 

Redux-saga中间件-----处理异步代码,在redux-saga里面会将一些异步代码放到单独文件里面

用了Redux-saga中间件,除了在reducer中接收action,还可以在saga文件中接收action

1)将Redux-saga插件安装到项目里面,https://github.com/redux-saga/redux-saga  链接

2)在src/store下创建sagas.js文件,用于存放异步代码

 

 

3)在创建store对象的文件里面进行如下配置,src/store/index.js

4)在src/store/actionTypes.js中定义常量

5)在创建action的文件src/store/actionCreators.js里面创建action,这个action返回的是对象

6)在组件生命周期里面调用

 

React-redux的使用

通过以下步骤创建了store,reducer,并且组件和store建立连接:

1)在项目中安装react-redux

2)在src/TodoList.js书写组件的内容,创建store,reducer对象之后,在component组件文件里面引进store对象之后,通过store.getState()拿到store的数据,从而让store和component 建立连接

3)在src/index.js中引进组件

4)在src/store/reducer.js下创建reducer,该文件返回纯函数,以及定义初始化state的数据

5)所有的数据放在store里面,在src/store/index.js下创建store对象

 

在React中使用Redux:
1)在src/index.js文件中使用React-redux的组件<Provider store={store}>这样使得组件Provider的子元素可以获取到store的内容

store与子component建立连接

2)在子组件中通过connect()使store和子组件建立连接,并且将store中的state映射到props,同时通过props修改store中的内容

3)通过上面配置,将action通过dispatch到store,并传给reducer,在reducer中需要根据action.type进行相应处理

改进后的组件:

 

Styled-Components的使用----让组件的样式只对组件的样式生效,不会在全局中生效,在标签上直接书写css然后输出该组件

问题:在src目录下有文件index.js    index.css  App.js,在文件index.js引进index.css,但没有在App.js里面引进index.css,也可以使用在index.css里面的类--------在React中引进css,将会在全局中生效,就会造成组件中的类冲突

解决方法:使用第三方插件---styled-components

styled-components的定义

styled-components 是一个常用的 css in js 类库,和所有同类型的类库一样,通过 js 解决了原生 css 所不具备的能力,比如变量、循环、函数等

styled-components比其他css预处理器的优点

  • 诸如 sass&less 等预处理可以解决部分 css 的局限性,但还是要学习新的语法,而且需要对其编译,需要复杂的 webpack 配置
  • 如果有过sass&less的经验,也能很快的切换到styled-components,因为大部分语法都类似,比如嵌套,& 继承等, styled-componens 很好的解决了学习成本与开发环境问题,很适合 React 技术栈 && React Native 的项目开发

styled-components解决的问题

  • className 的写法会让原本写css的写法十分难以接受
  • 如果通过导入css的方式 会导致变量泄露成为全局 需要配置webpack让其模块化
  • 以及上面提到的解决了原生 css 所不具备的能力,能够加速项目的快速开发

转载出处:https://www.jianshu.com/p/2178abb2ee95  

 

1、在项目中安装styled-components,不需要在文件中引进,但是将.css文件改成.style.js文件

2、全局样式injectClobal被createGlobalStyle替代,用组件的方式渲染,具体使用

3、将css reset的代码复制到createGlobalStyle里面----让默认样式在所有浏览器表现一致

 

 

使用iconfont嵌入头部图标

官网  https://www.iconfont.cn/

1、登录iconfont,在“图标管理”下选择“我的项目”,点击右边“新建项目”的图标

2、在主页的搜索框中输入要查找的图标名,然后选择要的图表,选择“添加入库”

3、所有图表选择好之后,点击右上角的“购物车”图标,点击“添加至项目”

4、然后点击“下载至本地”

5、然后将压缩包解压缩,将文件iconfont.eot       iconfont.svg      iconfont .ttf       iconfont .woff文件复制到项目的src/static/iconfont文件夹下面

6、在项目中使用 iconfont,首先需要想修改文件iconfont.css里面的内容:将路径以iconfont开头的路径改成相对路径

7、图标字体可能是用于全局的,所以当成全局样式来处理,将iconfont.css文件改成iconfont.js,并修改为样式组件,内容如下:

8、在src/App.js里面引入该全局样式组件

9、将Header组件里面的搜索、Aa、笔用iconfont代替

 

搜索框动画效果实现(聚焦搜索框变宽,搜索按钮有背景色,blur则变小)

使用react-transition-group插件的CSSTransition组件,用css实现动画效果

 

使用react-redux进行应用数据管理------组件的数据使用react-redux管理的话,组件就变成无状态组件了,使得性能大大提升

在项目中安装redux(数据框架)

在项目中安装react-redux(方便我们在react中使用redux)

需要定义的文件有index.js(store),reducer.js,constantTypes.js,

 

使用combineReducers完成对数据的拆分管理

对react-redux中的数据在浏览器端调试的插件是redux-devtools-extend,要想在浏览器中使用该插件调试redux中的数据,需要在创建store的时候,进行配置

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

到此这篇react组件必不可少的函数(react 函数组件)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 蓝牙地址是什么意思(当前移动设备的蓝牙地址是什么意思)2025-05-13 22:54:11
  • keil3破解安装教程(keil μvision4及破解版的安装过程?)2025-05-13 22:54:11
  • react 组件(react组件通信)2025-05-13 22:54:11
  • 移动硬盘上怎么设置密码(移动硬盘怎么设置密码win10)2025-05-13 22:54:11
  • react入门到精通(react 入门到精通)2025-05-13 22:54:11
  • react组件框架(reactui框架)2025-05-13 22:54:11
  • non—native翻译(none 翻译)2025-05-13 22:54:11
  • react组件三大属性(react组件定义)2025-05-13 22:54:11
  • 给移动硬盘设置密码(给移动硬盘设置密码怎么弄)2025-05-13 22:54:11
  • react组件constructor(react组件间传值的方法)2025-05-13 22:54:11
  • 全屏图片