React学习记录

源文链接:https://zh-hans.reactjs.org/docs/composition-vs-inheritance.html

Hello World

ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('root')
);

JSX

一个 JavaScript 的语法扩展.。

  1. const name = 'Josh Perez';
    const element = <h1>Hello, {name}</h1>;
  2. 在 JSX 语法中,你可以在大括号内放置任何有效的 JavaScript 表达式。例如,2 + 2user.firstNameformatName(user) 都是有效的 JavaScript 表达式。
  3. JSX 也是一个表达式。

元素渲染

1.React 元素是不可变对象。一旦被创建,你就无法更改它的子元素或者属性。一个元素就像电影的单帧:它代表了某个特定时刻的 UI。根据我们已有的知识,更新 UI 唯一的方式是创建一个全新的元素,并将其传入 ReactDOM.render()

  1. React 只更新它需要更新的部分。

组件 & Props

  1. 定义组件最简单的方式就是编写 JavaScript 函数:
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
  1. 你同时还可以使用 ES6 的 class 来定义组件:
class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

3.Props 的只读性。所有 React 组件都必须像纯函数一样保护它们的 props 不被更改。
4.渲染组件

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

const element = <Welcome name="Sara" />;
ReactDOM.render(
  element,
  document.getElementById('root')
);

State & 生命周期

  1. 不要直接修改 State。(this.setState)
  2. State 的更新可能是异步的。
  3. State 的更新会被合并。
  4. 数据是向下流动的。

事件处理

  1. React 事件的命名采用小驼峰式(camelCase),而不是纯小写。使用 JSX 语法时你需要传入一个函数作为事件处理函数,而不是一个字符串。
  2. this.handleClick = this.handleClick.bind(this);bind绑定this

条件渲染

React 中的条件渲染和 JavaScript 中的一样,使用 JavaScript 运算符 if 或者条件运算符去创建元素来表现当前的状态,然后让 React 根据它们来更新 UI。

function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  if (isLoggedIn) {
    return <UserGreeting />;
  }
  return <GuestGreeting />;
}

ReactDOM.render(
  // Try changing to isLoggedIn={true}:
  <Greeting isLoggedIn={false} />,
  document.getElementById('root')
);

在极少数情况下,你可能希望能隐藏组件,即使它已经被其他组件渲染。若要完成此操作,你可以让 render 方法直接返回 null,而不进行任何渲染。

列表&Key

  1. key 只是在兄弟节点之间必须唯一
  2. key 会传递信息给 React ,但不会传递给你的组件。如果你的组件中需要使用 key 属性的值,请用其他属性名显式传递这个值。即props.key读取不到key的值。

表单

受控组件
  1. <input type="text">, <textarea> 和 <select> 之类的标签都非常相似—它们都接受一个 value 属性,你可以使用它来实现受控组件。
  2. 你可以将数组传递到 value 属性中,以支持在 select 标签中选择多个选项:
    <select multiple={true} value={['B', 'C']}>
  3. <input type="file" /> value只读,非受控。
  4. 当需要处理多个 input 元素时,我们可以给每个元素添加 name 属性,并让处理函数根据 event.target.name 的值选择要执行的操作。

状态提升

在 React 中,将多个组件中需要共享的 state 向上移动到它们的最近共同父组件中,便可实现共享 state。这就是所谓的“状态提升”。

  1. 保留三位小数并四舍五入后的转换结果:Math.round(output * 1000) / 1000;round() 方法可把一个数字舍入为最接近的整数。
  2. 在 React 应用中,任何可变数据应当只有一个相对应的唯一“数据源”。通常,state 都是首先添加到需要渲染数据的组件中去。然后,如果其他组件也需要这个 state,那么你可以将它提升至这些组件的最近共同父组件中。你应当依靠自上而下的数据流,而不是尝试在不同组件间同步 state。

包含关系

使用一个特殊的 children prop 来将他们的子组件传递到渲染结果中

  1. 少数情况下,你可能需要在一个组件中预留出几个“洞”。这种情况下,我们可以不使用 children,而是自行约定:将所需内容传入 props,并使用相应的 prop。
  2. React 元素本质就是对象(object),所以你可以把它们当作 props,像其他数据一样传递。这种方法可能使你想起别的库中“槽”(slot)的概念,但在 React 中没有“槽”这一概念的限制,你可以将任何东西作为 props 进行传递。
  3. 组合也同样适用于以 class 形式定义的组件。

React哲学

  1. 将设计好的 UI 划分为组件层级。
  2. 用 React 创建一个静态版本。(最好将渲染 UI 和添加交互这两个过程分开,props 是父组件向子组件传递数据的方式。即使你已经熟悉了 state 的概念,也完全不应该使用 state 构建静态版本。state 代表了随时间会产生变化的数据,应当仅在实现交互时使用。所以构建应用的静态版本时,你不会用到它。)
  3. 确定 UI state 的最小(且完整)表示。(该数据是否是由父组件通过 props 传递而来的?如果是,那它应该不是 state。该数据是否随时间的推移而保持不变?如果是,那它应该也不是 state。你能否根据其他 state 或 props 计算出该数据的值?如果是,那它也不是 state。)
  4. 确定 state 放置的位置(React 中的数据流是单向的,并顺着组件层级从上往下传递。)
    5.添加反向数据流。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 3. JSX JSX是对JavaScript语言的一个扩展语法, 用于生产React“元素”,建议在描述UI的时候...
    pixels阅读 7,911评论 0 24
  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 12,688评论 1 33
  • HTML模版 之后出现的React代码嵌套入模版中。 1. Hello world 这段代码将一个一级标题插入到指...
    ryanho84阅读 11,410评论 0 9
  • $ 前言   最近在考虑框架转型,鉴于作为一名JSer,要时时刻刻保持对新技术和流行技术的敏感性,而 React、...
    果汁凉茶丶阅读 22,130评论 5 32
  • 1、什么是react React.js 是一个帮助你构建页面 UI 的库。React.js 将帮助我们将界面分成了...
    谷子多阅读 7,294评论 1 13