笔记:05:React

目录

1、script。
2、jsx语法
3、绑定事件
4、函数组件
5、解析html
6、遍历
7、判断
8、slot插值
9、jsx编译
10、创建组件---createClass
11、创建组件---component(es6)
12、组件通信
13、表单内容
14、性能优化
15、路由
16、路由传参
17、生命周期
18、key的作用
19、状态(state)和属性(props)之间有何不同
20、虚拟dom
21、为什么说虚拟dom会提高性能?
22、diff算法
23、dva:js和jsx的区别
24、dva:路由跳转
25、刷新拦截

正文

1、script。默认type='text/javascript'
  • <script type='text/babel'>,页面在加载时会被browser.js编译成真正的js插入页面中。
2、jsx语法
  • jsx是js和html混合的写法,遇到<>以html形式进行解析,遇到{}以js形式进行解析。
3、绑定事件
  • 不传参:例:<div onClick={f1}></div>
  • 传参:例:<div onClick={(e)=>{f2(100,e)}}></div>
4、函数组件(将模板return出去)

普通函数调用:例:{Ipt()}
组件形式调用:例:<Ipt a='10' b={20}></Ipt>。参数用props接收。定义时首字母大写。

5、解析html

dangerouslySetInnerHTML(==v-html):例:

<div dangerouslySetInnerHTML={{__html:str_x}}></div>
6、遍历
7、判断
8、slot插值
  • 通过props.children获得。
9、jsx编译
var x = <div id="box"> hello </div>
var x = React.createElement("div",{id:"box"},[React.createElement("em",{key:1},"hello"),React.createElement("span",{key:2},"span")])
10、创建组件---createClass
  • createClass:React.createClass({})
  • getInitialState:组件内部的状态,可相应的,是一个function返回对象。例:
getInitialState(){
    return {
        num:0
    }
}
  • render:定义模板。this指向组件实例。例:
render(){
    return(
        <div>
            <button onClick={()=>{this.increase(100)}}></button>
        </div>
    )
}
  • 方法。方法内部本身为null,改变this指向后,this指向组件实例。例:
increase(a){
    this.setState({ // 修改状态;访问状态:this.state.val
        num:this.state.num+a
    },()=>{ // 数据变化,DOM更新之后执行函数,类似于Vue nextTick
        console.log(this.refs.txt.innerHTML) // 操作DOM
    })
}

因为setState是一个异步的过程,所以说执行完setState之后不能立刻更改state里面的值。如果需要对state数据更改监听,setState提供第二个参数,就是用来监听state里面数据的更改,当数据更改完成,调用回调函数。

11、创建组件---component(es6)

class App extends React.Component{}

  • constructor:定义自身的方法和属性。例:
constructor(props){
    super(props); // 继承
    this.state={
        num:100
    }
}
12、组件通信 原文链接
  • 父--->子:父组件通过向子组件传递props,子组件得到props后进行相应的处理。
  • 子--->父:利用回调函数,可以实现子组件向父组件通信:父组件将一个函数作为props传递给子组件,子组件调用该回调函数,便可以向父组件通信。
  • 兄弟:react-redux 原文链接 redux是react中常用的一个进行集中状态管理的工具,当一个状态被多个状态所访问时,传统组件通信过于繁琐,可以将状态放入redux。
13、表单内容
<input type="text" value={this.state.val} onChange={(e)=>{this.setState({val:e.target.value})}}/>
14、性能优化
  • 组件内部调用setState,当前组件及子组件都会重新渲染,生命周期并不会重复执行。
  • shouldComponentUpdate:决定组件是否重新渲染,return true 渲染。可以避免不必要的dom操作。
  • PureComponent:class Index extends React.PureComponent{}
  • 使用路由懒加载。
  • 使用key来帮助React识别列表中所有子组件的最小变化。
15、路由

路由暴露对象是ReactRouterDom。例:

let { HashRouter, Route, Link, Redirect, Switch, withRouter} = ReactRouterDom
  • Route包裹路由组件。例:<Route path='/' component={Index}/>
  • Link类似于vue中 router-link。例:<Link to='/'> 首页 </Link>
  • NavLink:是Link的一个特定版本,会在匹配上当前的url的时候,给已经渲染的元素添加 样式 参数。原文链接
  • BrowserRouter(路径不带#)、HashRouter(路径带#)限定路由使用区域 原文链接
  • withRouter:对普通组件进行包裹,将路由相关对象注入到组件。只有路由组件上props内部包含路由相关信息及方法。需要使用withRouter将路由对象注入 非路由 组件的props上。
  • Redirect:路由重定向。
  • Switch:确保包含的Route组件只匹配一个。
16、路由传参 原文链接
  • 方式一:params(刷新页面数据不会丢失)
    路由配置:例:<Route path='/detail/:id' component={Detail}></Route>
    路由跳转:例:this.props.history.push('/detail/10');<Link to='/detail/10'></Link>
    注意:js跳转时,需要使用withRouter。例:export default withRouter(connect(getProps,getDis)(List)) 父组件
    路由页面接收参数:例:this.props.history.match.params.id
    当前路由:例:localhost:3000/detail/10
  • 方式二:state(刷新页面数据不会丢失)
    路由配置:例:<Route path='detail' component={Detail}></Route>
    路由跳转:例:this.props.history.push({pathname:'/detail',state:{id:10}});<Link to={{pathname:'detail',state:{id:10}}}></Link>
    注意:js跳转时,需要使用withRouter。例:export default withRouter(connect(getProps,getDis)(List)) 父组件
    路由页面接收参数:例:this.props.location.state.id
    当前路由:例:localhost:3000/detail
  • 方式三:query(刷新页面数据丢失)
    路由配置:例:<Route path='detail' component={Detail}></Route>
    路由跳转:例:this.props.history.push({pathname:'/detail',query:{id:10}});<Link to={{pathname:'detail',query:{id:10}}}></Link>
    注意:js跳转时,需要使用withRouter。例:export default withRouter(connect(getProps,getDis)(List)) 父组件
    路由页面接收参数:例:this.props.location.query.id
    当前路由:例:localhost:3000/detail
17、生命周期 原文链接

声明周期里的this指向组件实例。

  • 1、getDefaultProps
    这个方法是用来设置组件默认的props,组件生命周期只会调用一次。只适用于React.createClass直接创建组件。
  • 2、getInitialState
    设置state初始值,可以访问到this.props。只适用于React.createClass。
  • 3、componentWillMount
    这个方法在组件首次渲染之前调用,这个是在render方法调用之前可以修改state的最后一次机会。这个很少用到。
  • 4、render
    JSX通过这里,可以解析成对应的虚拟DOM,渲染成最终结果。
  • 5、componentDidMount
    这个方法在首次真实的DOM渲染后调用(仅此一次)。当我们需要访问真实的DOM时,在这个方法中访问。
  • 6、componentWillReceiveProps
    每当我们通过父组件更新子组件props时(这个也是唯一途径),这个方法被调用。
  • 7、shouldComponentUpdate
    字面意思,是否应该更新组件,默认返回 true。当返回 false 时,后期函数就不会调用,组件不会在次渲染。
  • 8、componentWillUpdate
    组件将会更新,props和state改变后必调用。
  • 9、render
    跟实例化的render一样。
  • 10、componentDidUpdate
    这个方法在更新真实的DOM成功后调用,当我们需要访问真实的DOM时,这个方法也经常用到。
  • 11、componentWillUnmount
    每当组件调用,这个组件就必须从DOM中销毁,此时该方法就会被调用。当我们在组件中使用了setInterval,那我们就需要在这个方法中调用clearInterval。如果手动使用了addEventListener绑定事件,也需要解绑事件。
18、key的作用
  • Keys 是 React 用于追踪哪些列表中元素被修改、被添加或者被移除的辅助标识。
19、状态(state)和属性(props)之间有何不同
  • state:是一种数据结构,用于组件挂载时所需数据的默认值。state可能会随着时间的推移而发生突变,但多数时候,是作为用于事件行为的结果。
  • props(properties):是组件的配置。props由父组件传递给子组件,并且就子组件而言,props是不可变得。组件不能改变自身的props,但是可以把其子组件的props放在一起(统一管理)。props也不仅仅是数据,回调函数也可以通过props传递。
20、虚拟dom
  • 本质:用js对象,来模拟DOM元素的嵌套关系;
  • 目的:就是为了实现页面元素的高效更新。
21、为什么说虚拟dom会提高性能?
  • 说Virtual(虚拟) DOM高效的一个理由就是它不会直接操作原生的DOM节点,因为这个很消耗性能。当组件状态变化时它会通过某些diff算法去计算出本次数据更新真实的视图变化,然后只改变“需要改变”的DOM节点。
  • 虚拟 dom 相当于在 js 和真实 dom 中间加了一个缓存,利用 dom diff 算法避免了没有必要的 dom 操作,从而提高性能。
22、diff算法
  • tree diff:新旧两棵DOM树,逐层对比的过程,就是Tree Diff;当整棵DOM逐层对比完毕,则所有需要按需更新的元素,必然能够找到。
  • component diff:在进行Tree Diff的时候,每一层中,组件级别的对比,叫做Component Diff。
    如果对比前后,组件类型相同,则暂时认为组件不需要被更新。
    如果对比前后,组件类型不同,则需要移除旧组件。创建新组建,并追加到页面上。
  • element diff:在进行组件对比的时候,如果两个组件类型相同,则需要进行元素级别的对比,这叫做Element Diff。
23、dva:js和jsx的区别
  • JS:即JavaScript,一种直译式脚本语言。
  • JSX:即JavaScript XML——一种在React组建内部构建标签的类XML语法。(增强React程序组件的可读性)。
  • 区别:浏览器只能识别普通的js,普通的css,并不能识别scss,或者jsx(scss是css的拓展,jsx可以看做是js的拓展),所以webpack的作用是把scss转换为css,把jsx转换为浏览器可以识别的js,然后浏览器才能正常使用。
    JSX语法,像是在Javascript代码里直接写XML的语法,实质上这只是一个语法糖,每一个XML标签都会被JSX转换工具转换成纯Javascript代码,React 官方推荐使用JSX, 当然你想直接使用纯Javascript代码写也是可以的,只是使用JSX,组件的结构和组件之间的关系看上去更加清晰。
24、dva:路由跳转
  • 1、'dva/router'下引入Link;
    布局中使用<Link to='/'>去首页</Link>
  • 2、this.props.history.push('/') // 注:需要将父级页面的history传递过来。
  • 3、组件文件引入:import {withRouter} from 'dva/router'
    export default withRouter(ListBtn)
  • 4、组件文件引入:import {routerRedux} from 'dva/router'
    this.props.dispatch(routerRedux.push('/'))
25、刷新拦截(参考文件
  componentWillMount () {
    // 拦截判断是否离开当前页面
    window.addEventListener('beforeunload', this.beforeunload);
  }
  componentWillUnmount () {
    // 销毁拦截判断是否离开当前页面
    window.removeEventListener('beforeunload', this.beforeunload);
  }
  beforeunload (e) {
    let confirmationMessage = '你确定离开此页面吗?';
    (e || window.event).returnValue = confirmationMessage;
    return confirmationMessage;
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容