Closed amenzai closed 6 years ago
教程笔记
// 输入框中输入 html 标签时,加此属性不自动转义 <li dangerouslySetInnerHTML={{__html: item}}></li> this.setState((prevState) => ({ list: [...prevState.list, prevState.inputValue] })) constructor(props) { super(props) this.handleClick = this.handleClick.bind(this) }
子组件在调用父组件方法时,通过属性传递时,父组件方法需要 bind(this)
react 的一些思考
第一点:
第二点:
当组件 state or props 改变,render 函数重新执行。
当父组件的 render 函数被运行时,它的子组件的 render 都将被运行一次
第三点:虚拟 DOM
就是个 JS 对象
参考文章
虚拟 DOM 使得跨端应用得以实现
第四点:diff 算法
第五点:ref
<span ref="{(el) => {this.span = el}}"></span> // this.span 就是 span 标签 this.setState(()=>{},()=>{}) // 在第二个参数获取 DOM 才正确
尽量不使用 ref,毕竟应该数据驱动视图
第六点:生命周期函数
某一个时刻执行的函数。
第七点:生命周期函数使用场景
避免子组件做无畏的渲染:
shouldComponentUpdate(nextProps, nextState) { if (nextProps.content !== this.props.content) { return true } else { return false } }
第八点:发送ajax请求
在 componentDidMount() 生命周期函数内调用,使用 axios 库。
第九点:使用 charles 实现本地数据
下载 charles
新建 json 数据文件,在 charles 中创建相应代理。
第十点:react 实现 css 过渡动画
让一个 DOM 在显示 隐藏中切换(opacity),借助 CSS3 的 transition 属性即可实现。
第十一点:使用 css 动画效果
使用 @keyframes
方法就是添加类
第十二点:使用 react -transition-group
使用方法
// in 就是根据true false 判断 入场或出场动画 // unmountOnExit 出场后 移除DOM // appear 页面显示 展示入场动画 <CSSTransition in={focused} timeout={200} classNames="slide" unmountOnExit onEntered={(el) => {el.style.color="blue"}} appear={true} > <div className="slide-enter">123</div> </CSSTransition>
页面每插入一项都添加动画,方法可见上面连接的文档。
一些 API:
UI组件和容器组件:
容器组件编写业务逻辑,向 UI 组件通过属性传入所需数据,即 UI 只提供显示。
无状态组件:
就是个函数
const Demo = (pros) => { return ( <div>123{props.content}</div> ) }
处理异步的 redux 中间件:
redux-thunk:使用方法
与 redux-devtools 结合使用:查看地址
redux 中间件就是在 dispatch(action) 时,发现 action 是函数的话,会进行处理,然后再回到 dispatch(action),当 action 对象时,store 接管,给 reducer 处理。
另一个异步中间件 redux-saga:使用方法
// state 挂载到 props 上 const mapStateTOProps = (state) => { return { test: state.test } } // store.dispatch 挂载到 props 上 const mapDispatchToProps = (dispatch) => { return { handleLogin() { } } } export default connect(mapStateTOProps, mapDispatchToProps)(DemoComponent)
1、
使用 style-components 对每个组件样式进行管理:
yarn add style-components
在 index.js 文件中引入 style.js 文件
2、
immutable.js:使用方法
// 子 reducer.js import { fromJS } from 'immutable'; const defaultState = fromJS({ focused: false, mouseIn: false, list: [], page: 1, totalPage: 1 }); export default (state = defaultState, action) => { switch(action.type) { case constants.SEARCH_FOCUS: return state.set('focused', true); case constants.SEARCH_BLUR: return state.set('focused', false); case constants.CHANGE_LIST: return state.merge({ list: action.data, totalPage: action.totalPage }); case constants.MOUSE_ENTER: return state.set('mouseIn', true); case constants.MOUSE_LEAVE: return state.set('mouseIn', false); case constants.CHANGE_PAGE: return state.set('page', action.page); default: return state; } } // 总 reducer.js import { combineReducers } from 'redux-immutable'; // index.js const mapStateToProps = (state) => { return { focused: state.getIn(['header', 'focused']), list: state.getIn(['header', 'list']), page: state.getIn(['header', 'page']), totalPage: state.getIn(['header', 'totalPage']), mouseIn: state.getIn(['header', 'mouseIn']), login: state.getIn(['login', 'login']) } }
3、
避免无意义请求发送:
根据每次触发事件时的参数来判断这个请求是否需要再次发送。
4、
每次开发,先分析页面布局,能抽的组件抽一下,然后编写样式,使用 redux 编写一些静态数据看效果,然后设置action,异步请求数据。
5、
获取 url 中的参数:
6、
异步组件:react-loadable
7、
不是 <Route path='/detail/:id' exact component={Detail}></Route> 里面的组件,想要获取路由信息,需要这样:
<Route path='/detail/:id' exact component={Detail}></Route>
import { withRouter } from 'react-router-dom' @withRouter @connect( null, { loadData } )
8、
项目部署服务器
教程笔记
react 初探
react 基础
子组件在调用父组件方法时,通过属性传递时,父组件方法需要 bind(this)
react 的一些思考
react 进阶
第一点:
第二点:
当组件 state or props 改变,render 函数重新执行。
当父组件的 render 函数被运行时,它的子组件的 render 都将被运行一次
第三点:虚拟 DOM
就是个 JS 对象
参考文章
虚拟 DOM 使得跨端应用得以实现
第四点:diff 算法
第五点:ref
尽量不使用 ref,毕竟应该数据驱动视图
第六点:生命周期函数
某一个时刻执行的函数。
第七点:生命周期函数使用场景
避免子组件做无畏的渲染:
第八点:发送ajax请求
在 componentDidMount() 生命周期函数内调用,使用 axios 库。
第九点:使用 charles 实现本地数据
下载 charles
新建 json 数据文件,在 charles 中创建相应代理。
第十点:react 实现 css 过渡动画
让一个 DOM 在显示 隐藏中切换(opacity),借助 CSS3 的 transition 属性即可实现。
第十一点:使用 css 动画效果
使用 @keyframes
方法就是添加类
第十二点:使用 react -transition-group
使用方法
页面每插入一项都添加动画,方法可见上面连接的文档。
redux
参考文章
一些 API:
UI组件和容器组件:
容器组件编写业务逻辑,向 UI 组件通过属性传入所需数据,即 UI 只提供显示。
无状态组件:
就是个函数
处理异步的 redux 中间件:
redux-thunk:使用方法
与 redux-devtools 结合使用:查看地址
redux 中间件就是在 dispatch(action) 时,发现 action 是函数的话,会进行处理,然后再回到 dispatch(action),当 action 对象时,store 接管,给 reducer 处理。
另一个异步中间件 redux-saga:使用方法
react-redux
实战
1、
使用 style-components 对每个组件样式进行管理:
在 index.js 文件中引入 style.js 文件
2、
immutable.js:使用方法
3、
避免无意义请求发送:
根据每次触发事件时的参数来判断这个请求是否需要再次发送。
4、
每次开发,先分析页面布局,能抽的组件抽一下,然后编写样式,使用 redux 编写一些静态数据看效果,然后设置action,异步请求数据。
5、
获取 url 中的参数:
6、
异步组件:react-loadable
7、
不是
<Route path='/detail/:id' exact component={Detail}></Route>
里面的组件,想要获取路由信息,需要这样:8、
项目部署服务器