回顾Javascript React基础


Posted in Javascript onJune 15, 2019

前言

React核心的单向数据流、一切皆数据的state、不会改变的props,以及状态提升等等经常使用便不多总结,需要的看官方文档。

JSX

JSX 本质只是为 React.createElement(component, props, ...children)提供的语法糖!

  • 1.React DOM 在渲染之前都被转换成了字符串,它天生自带防止 XSS 攻击的属性。
  • 2.Babel 转译器会把 JSX 转换成一个名为 React.createElement()的方法调用。在线babel编译

以下两段代码等价(许多react的界面设计器通过这个原理,达到元数据转化React元素,实现界面化编程!)
嵌套就是多个create方法的嵌套。

function hello() {
return <div className="red">Hello,<span>world!</span></div>;
}
"use strict";
function hello() {
return React.createElement(
"div",
{ className: "red" },
"Hello,",
React.createElement(
"span",
null,
"world!"
)
);
}

  • 3.JSX中的属性是可以任何 {} 包裹的 JavaScript 表达式作为一个属性值,不能使用if和for。

需要循环和条件渲染可以使用map、三目,或者使用if/for在jsx代码之外!

//错误的!
class A extends React.Component {
render() {
return <div>{if(){}else{}}</div>;//原来还蒙蔽的不知道为什么错了0.0
}
}

React.Component (组件)

创建组件的四种方式:

React.Component 方式

class Greeting extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}

ES5

var createReactClass = require('create-react-class');
var Greeting = createReactClass({
render: function() {
return <h1>Hello, {this.props.name}</h1>;
}
});
//或者使用react
var Greeting = React.create({
render: function() {
return <h1>Hello, {this.props.name}</h1>;
}
});

函数式

const Button = ({
day,
increment
}) => {
return (
<div>
<button onClick={increment}>Today is {day}</button>
</div>
)
}

PureComponet

大多数情况下, 我们使用PureComponent能够简化我们的代码,并且提高性能,但是PureComponent的自动为我们添加的shouldComponentUpate函数,只是对props和state进行浅比较(shadow comparison),当props或者state本身是嵌套对象或数组等时,浅比较并不能得到预期的结果,这会导致实际的props和state发生了变化,但组件却没有更新的问题。当然还是有解决的方法的,所以建议还是少用。

事件处理

事件绑定的四种方法:推荐使用第一第二种。

class Toggle extends React.Component {
constructor(props) {
{...}
//方法一必须在这里绑定
this.handleClick1 = this.handleClick.bind(this);
}
handleClick1() {
this...
}
//方法二使用【属性初始化器语法】【需要开启babel stage-0以上】
handleClick2=()=> {
this...
}
render() {
return (
<div>
<button onClick={this.handleClick1}></button>
<button onClick={this.handleClick2}></button>
//方法三在使用时绑定
<button onClick={this.handleClick1.bind(this)}></button>
//方法四在回调函数中使用 箭头函数
/**
渲染的时候都会创建一个不同的回调函数。在大多数情况下,这没有问题。然而如果这个回调函数作为一个属性值传入低阶组件,这些组件可能会进行额外的重新渲染。我们通常建议在构造函数中绑定或使用属性初始化器语法来避免这类性能问题。
**/
<button onClick={(e) => this.handleClick1(e)}></button>
</div>
);
}
}

组合 vs 继承

在React中不推荐使用继承,不推荐继承自定义Component。

//不推荐使用
class Parent extends React.Component {
render() {
return <div>...</div>;
}
}
class A extends Parent {
render() {
return <div>...</div>;
}
}
//推荐使用
class A extends React.Component {
render() {
return <Parent>...</Parent>;
}
}

不使用 ES6

  • Component || create
  • defaultProps || getDefaultProps
  • constructor state || getInitialState
  • this bind || 不需要
class Greeting extends React.Component {
constructor(props) {
super(props);
this.state = {count: props.initialCount};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
alert(this.state.message);
}
render() {
return <h1 onClick={this.handleClick}>Hello, {this.props.name}</h1>;
}
}
Greeting.defaultProps = {
name: 'Mary'
};
var createReactClass = require('create-react-class');
var Greeting = createReactClass({
getInitialState: function() {
return {count: this.props.initialCount};
},
getDefaultProps: function() {
return {
name: 'Mary'
};
},
handleClick: function() {
alert(this.state.message);
},
render: function() {
//组件中的方法会自动绑定至实例,不需要像上面那样加 .bind(this)
return <h1 onClick={this.handleClick}>Hello, {this.props.name}</h1>;
}
});

Refs

1.如果可以通过声明式实现,则尽量避免使用 refs。

2.不能在函数式组件上使用 ref 属性,因为它们没有实例

3.旧版 API:String 类型的 Refs,存在问题,可能会在未来移除,不推荐使用。

4.对父组件暴露refs,在父元素拿子元素

function CustomTextInput(props) {
return (
<div>
<input ref={props.inputRef} />
</div>
);
}

class Parent extends React.Component {
//this.inputElement 就是CustomTextInput中的input
render() {
return (
<CustomTextInput
inputRef={el => this.inputElement = el}
/>
);
}
}

ReactDOM

获取一个DOM除了refs还有更加简单粗暴的方法findDOMNode。

findDOMNode 是用于操作底层DOM节点的备用方案。使用它的优先级比refs更低!!

findDOMNode 只对挂载过的组件有效。

findDOMNode 不能用于函数式的组件中。

import ReactDOM from 'react-dom';
ReactDOM.render(
element,
container,
[callback]//不为人知的第三个参数!!
)
ReactDOM.unmountComponentAtNode(container)
ReactDOM.findDOMNode(component)

不常用的新发现

  • 空的 JSX 标签Fragments <></>或者<React.Fragment></React.Fragment>
  • 与运算符 && true && expression 总是返回 expression,而 false && expression 总是返回 false。
  • 阻止组件渲染常用null组件的 render 方法返回 null 并不会影响该组件生命周期方法的回调。例如,componentWillUpdate 和 componentDidUpdate 依然可以被调用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript MD4
Dec 20 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
Jan 15 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
Mar 03 Javascript
JQuery 控制内容长度超出规定长度显示省略号
May 23 Javascript
jQuery调用ajax请求的常见方法汇总
Mar 24 Javascript
js验证上传图片的方法
May 12 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
Jan 22 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
Jul 05 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
Mar 29 Javascript
Node.js 使用流实现读写同步边读边写功能
Sep 11 Javascript
js实现数组内数据的上移和下移的实例
Nov 14 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
Sep 29 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
Jun 14 #Javascript
微信小程序版本自动更新的方法
Jun 14 #Javascript
vue+express+jwt持久化登录的方法
Jun 14 #Javascript
深入剖析JavaScript instanceof 运算符
Jun 14 #Javascript
ES6 Promise对象的含义和基本用法分析
Jun 14 #Javascript
ES6顶层对象、global对象实例分析
Jun 14 #Javascript
ES6数组与对象的解构赋值详解
Jun 14 #Javascript
You might like
深入理解PHP原理之Session Gc的一个小概率Notice
2011/04/12 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
php生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
jQuery实现折叠、展开的菜单组效果代码
2015/09/16 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
浅谈Vue.js
2017/03/02 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
Vue响应式原理Observer、Dep、Watcher理解
2019/06/06 Javascript
elementUi vue el-radio 监听选中变化的实例代码
2019/06/28 Javascript
使用Angular material主题定义自己的组件库的配色体系
2019/09/04 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
2020/06/05 Javascript
浅谈scrapy 的基本命令介绍
2017/06/13 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
小学生安全演讲稿
2014/04/25 职场文书
家长会演讲稿
2014/04/26 职场文书
cf战队收人口号
2014/06/21 职场文书
工作证明格式及范本
2014/09/12 职场文书
首都博物馆观后感
2015/06/05 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
2016年“我们的节日·中秋节”活动总结
2016/04/05 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书