资讯专栏INFORMATION COLUMN

React基础再回顾

2450184176 / 1968人阅读

摘要:方法一必须在这里绑定方法二使用属性初始化器语法需要开启以上方法三在使用时绑定方法四在回调函数中使用箭头函数渲染的时候都会创建一个不同的回调函数。然而如果这个回调函数作为一个属性值传入低阶组件,这些组件可能会进行额外的重新渲染。

从16年夏天初学React,到17年正式投入到工作中使用,直到现在V16.2发版,React发生了巨大的变化,最近在工作中使用时遇到很多基础不是非常清晰,借此再读React官方文档【中文】。

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 
Hello,world!
; }
"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 
{if(){}else{}}
;//原来还蒙蔽的不知道为什么错了0.0 } }
React.Component (组件)

创建组件的四种方式:详情对比参见或者react官网

React.Component 方式

class Greeting extends React.Component {
  render() {
    return 

Hello, {this.props.name}

; } }

ES5

 var createReactClass = require("create-react-class");
var Greeting = createReactClass({
  render: function() {
    return 

Hello, {this.props.name}

; } }); //或者使用react var Greeting = React.create({ render: function() { return

Hello, {this.props.name}

; } });

函数式

const Button = ({
  day,
  increment
}) => {
  return (
    
) }

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 (
    
//方法三在使用时绑定 //方法四在回调函数中使用 箭头函数 /** 渲染的时候都会创建一个不同的回调函数。在大多数情况下,这没有问题。然而如果这个回调函数作为一个属性值传入低阶组件,这些组件可能会进行额外的重新渲染。我们通常建议在构造函数中绑定或使用属性初始化器语法来避免这类性能问题。 **/
); } }
组合 vs 继承

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

//不推荐使用
class Parent extends React.Component {
  render() {
    return 
...
; } } class A extends Parent { render() { return
...
; } }
//推荐使用
class A extends React.Component {
  render() {
    return ...;
  }
}
不使用 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 

Hello, {this.props.name}

; } } 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 

Hello, {this.props.name}

; } });
Refs

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

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

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

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

function CustomTextInput(props) {
  return (
    
); } class Parent extends React.Component { //this.inputElement 就是CustomTextInput中的input render() { return ( 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 <>或者

与运算符 && true && expression 总是返回 expression,而 false && expression 总是返回 false。

阻止组件渲染常用null组件的 render 方法返回 null 并不会影响该组件生命周期方法的回调。例如,componentWillUpdate 和 componentDidUpdate 依然可以被调用。

### 高阶组件HOC 使用高阶组件(HOC)解决交叉问题

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93317.html

相关文章

  • 2018年前端开发回顾

    摘要:在整个年,看到发布版增加了许多功能,包括新的生命周期方法新的上下文指针事件延迟函数和。它在等待渲染异步响应时数据,是延迟函数背后用来管理组件的代码分割的。发布自第版开始将近年后,于年发布。 前端发展发展迅速,非常的快。 本文将回顾2018年一些重要的前端新闻,事件和 JavaScript 趋势。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! showImg(ht...

    crelaber 评论0 收藏0
  • 前端每周清单第 43 期:2017 JavaScript 回顾、Rust 与 WebAssembly

    摘要:杨冀龙是安全焦点民间白帽黑客组织核心成员,被浪潮之巅评为中国新一代黑客领军人物之一他在本文中依次分享了对于黑客的定义如何从黑客成为一名安全创业者技术创业踩过的坑给技术创业者建议等内容。 showImg(https://segmentfault.com/img/remote/1460000012377230?w=1240&h=796); 前端每周清单专注前端领域内容,以对外文资料的搜集为...

    xorpay 评论0 收藏0
  • react基础学习记录一

    摘要:虚拟的构建在组件渲染到网页前会执行一个这个函数必须和一起使用该函数在组件更新完后会自动执行,第三个参数是的返回值阶段发生在组件的删除前,会自动执行,我们常用于清除组件之前被添加的还会继续执行的东西。 react 学习记录 自己学习,记录便于后面回顾 基础知识点的记忆: state与props state是组件自己的数据,而props是父组件通过属性赋值方式将其传送给组件;这样达到了,...

    URLOS 评论0 收藏0
  • 2017年 JavaScript 框架回顾 -- 后端框架

    摘要:本文是年框架回顾系列的最后的一篇文章,主要介绍的后端框架情况。葡萄城公司成立于年,是全球领先的集开发工具商业智能解决方案管理系统设计工具于一身的软件和服务提供商。 本文是2017年 JavaScript 框架回顾系列的最后的一篇文章,主要介绍 JavaScript 的后端框架情况。 showImg(https://segmentfault.com/img/bV2TPd?w=735&h=...

    xiaoqibTn 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<