React知识点小结

react Dom与JSX关系

react页面渲染,由三部分构成:state 数据 + JSX模版 => 真实Dom(显示)

正常react渲染页面的步骤
  1. 页面首次加载:state 数据 + JSX模版 => 真实dom显示
  2. 页面改变:state 数据改变
  3. state + JSX模版重新生成 Dom 替换原始Dom 显示
react改进方式一:
  1. 页面首次加载:state 数据 + JSX模版 => 真实dom显示
  2. 页面改变:state 数据改变
  3. state + JSX模版重新生成新的Dom 但是不直接替换原始Dom 显示
  4. 将新的Dom和老的Dom做比对,找出差异
  5. 将新的Dom中修改的部分 替换到老的Dom中
react改进方式二(也是目前react实现的方式):
  1. 页面首次加载:state 数据 + JSX模版 => 生成虚拟Dom(JS对象) => 生成真实dom显示
//虚拟Dom
['div',{id:'id1'},['span',{},'hello']]
//真实Dom
<div>
  <span>hello2</span>
</div>
  1. 页面改变:state 数据改变
  2. 生成新的虚拟Dom,(即一个JS对象,用它来翻译成真实Dom)
//虚拟Dom
['div',{id:'id1'},['span',{},'hello2']]
  1. 比对两个虚拟Dom(两个JS对象比对),更改虚拟 Dom值
['div',{id:'id1'},['span',{},'hello2']]
  1. 由更改后的虚拟Dom重新生成 真实Dom显示
<div>
  <span>hello2</span>
</div>
改进方式二的优势:
  1. 操作都是JS对象,减少来对Dom的创建和比对。JS对象在js中比较替换是直接操控JS自身对象(Diff 算法),性能消耗比较小,若是 生成新的Dom对象及对Dom对象的比对,需要操作系统的application的方法,性能消耗大。
  2. 若两次setState时间较短,react会对比两次JS对象,最后只重新生成一次Dom

Diff 算法 -- 层层比对,父级相同则比对child,若child不同,直接替换,后续child不进行比对了。算法简单,因此比对速度快。因此在循环中key,尽量别使用index,这样就会使每次的循环都不能复用之前的index对象。引入Key值的原因就是为了提高虚拟Dom比对性能

ref 使用

// 1. 直接赋值
<input ref={(inputValue)=>{this.inputValue = inputValue}}> </input>
//使用:
console.log(this.inputValue.value);
 // 2. 
<input ref="inputValue"> </input>
//使用:
console.log(this.refs.inputValue.value);

ref的使用可以由以上两种方法, 但是react并不推荐大量使用ref,建议用数据驱动的方式操作Dom。
例如:利用ref的方式获取dom,在和setState同时使用会出问题:因为SetState是异步的,直接通过ref获取Dom节点从而取得的值可能不是最新的值。解决方案:setState后第二个参数里执行:

this.setState({
                dataList: tempList,
            }, ()=> {
                console.log(this.refs.inputValue.value);
            })

react 路由

  • 路由分为三种:静态路由:urlPath不同跳转不同页面;动态路由:页面之间跳转定义参数类型; get路由:页面之间跳转,和get请求一样方便传多个参数,一般用 cnpm install url --save 使用URL库进行参数解析, 本文样例Demo中有使用例子
路由类型 路由注册 路由跳转 路由接收
静态路由 <Route exact path="/" component={RouterHome} /> <Link to="/">Home</Link> -
动态路由 <Route path="/RouterContent/:myParams" component={RouteContent} /> <Link to={`/RouterContent/${value}`}> {value} </Link> this.props.match.params.myParams
get路由 <Route path="/RouterContent" component={RouteContent} /> <Link to={`/RouterContent?aid=${value}`}>{value}</Link> this.props.location.search

ant Design 使用

css 入门补充小知识

  1. ID选择符,调用的时候需要 <p id='bold'> </p>
// csss:
p#bold {
    color: red;
}
//js:
<p id='bold'>
          这个段落应该是粗体
</p>
  1. 群选择符
/*群选择符, 表示同时对逗号分割对标签操作*/
p,h1,h2 {
    text-align: center;
}
  • inherit: 继承父级的上层属性
  • background-attachment: fixed 背景图片是否跟着网页滑动
  • font-style : 是否斜体,oblique italic normal
  • font-weight: 字体粗细,font-size:字体大小
  • line-height: 行与行间距。
  • font-variant: 全部大小写,但是首字母的大写会更大些
  • text-indent: 文本首行缩进,px或者%
  • text-align: 文本对齐
  • text-decoration: 上滑线,下划线,删除线
  • text-transform: 首字母大写,变大写,变小写
  • :link: 设置未访问链接属性,:visited 设置访问过链接属性,:active 鼠标点击与释放,:hover 鼠标悬停时
  • float: left,right // 向哪个方向浮动
  • display:
    display: flex; //将对象作为弹性伸缩盒显示
    display: block;//block是一块状元素的方式显示
  • position:
    static(静态定位): 默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)
    relative(相对定位):生成相对定位的元素,通过top,bottom,left,right的设置相对于其正常(原先本身)位置进行定位。可通过z-index进行层次分级。
    absolute(绝对定位):生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。可通过z-index进行层次分级。
    fixed(固定定位):生成绝对定位的元素,相对于浏览器窗口进行定位。元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。可通过z-index进行层次分级。
  • display: flex , Flex 布局以后,子元素的float、clear和vertical-align属性将失效 。更多flex布局参考 阮一峰flex布局教程
flex容器(父组件)属性名 枚举值 备注
flex-direction row、row-reverse、column 、column-reverse 布局方向: ➡️、 ⬅️ 、⬇️、⬇️
flex-wrap nowrap、wrap、wrap-reverse 不换行、换行(第一行在最上方)、换行(第一行在最下方)
flex-flow <flex-direction> direction和wrap,都可以设置
justify-content flex-start、flex-end、center、space-between、space-around 居左、居右、居中、两边对齐、均分间隔相等
align-items flex-start、flex-end、center、baseline、stretch 项目的第一行文字的基线对齐 、 默认值
align-content flex-start、flex-end、center、space-between 、space-around 定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用
flex项目(子组件)属性名 枚举值 备注
order <integer> 项目排列顺序。从0开始数字越小越靠前
flex-grow <number> 放大比例,默认为0 不放大
flex-shrink <number> 缩小比例,默认为1,若空间不足,所有项目都将缩小
flex-basis <length> 跟width、height一样,占据固定空间
flex <flex-grow, flex-shrink> || <flex-basis>都可设置 flex:分数百分数多个数
align-self auto、flex-start、flex-end、center、baseline、stretch 单个子组件和其他子组件不同对齐方式,覆盖align-items:--_-
css 冲突
  • 更具体的,听从最具体的样式, id > 类别 > 元素
  • 两个层级样式表,遵循离内容比较近的样式
  • !important ,申明指示的位置优先,帮助诊断是否冲突
  • 选择符,
  • 元素

本文样例Demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345