React入门基础知识总结

1.React组件

  • function组件,
function Button() {
  return ()
}
  • class组件,来自ES6的class语法,
class Button extends React.Component{
  constructor(){
    super()
  }
  render(){
    return()
  }
}

2. 父子组件通信

  • 父组件通过props给子组件传递数据,
  • 子组件则是通过调用父组件传递给它的函数向父组件传递数据,调用时注意bind(this)

3. Redux(主要用于父子组件之间的通信)

3.1 VanillaJS

  1. 根据state和action创建一个reducer
  2. 由reducer创建一个存放状态的store
  3. 需要更改数据时,通过store.dispatch一个action来进行更改。例如store.dispatch({type: add},payload: 1)
  4. store.subscribe(render)监听store中state的变化,然后重新render
    核心代码
<body>
  <div>
    你点击了 <span id="value">0</span> 次
    <div>
      <button onclick="add1()">+1</button>
      <button onclick="minus()">-1</button>
      <button onclick="addIfOdd()">如果是单数就+1</button>
      <button onclick="addAsync()">1秒钟后+1</button>
    </div>
  </div>
  <script>
    function add1(){
      store.dispatch({type: 'increase'})
    }
    function minus(){
      store.dispatch({type: 'decrease'})
    }
    function addIfOdd(){
      if (store.getState() %2 === 1){
        store.dispatch({type: 'increase'})
      }
    }
    function addAsync(){
      setTimeout(()=>{
        store.dispatch({type:'increase'})
      },1000)
    }
    function reducer(state,action){
      if (state === undefined){
        return 0
      }
      switch(action.type){
        case 'increase' : 
          return state + 1;
        case 'decrease':
          return state - 1;
        default:
          return state;
      }
    }
    store = Redux.createStore(reducer)
    const render = function(){
        document.querySelector('#value').innerHTML = store.getState()
    }
    render()
    store.subscribe(render)
  </script>
</body>

</html>

3.2 React+Redux

  1. 代码结构和原生js的redux1-2-3-4差不多
  2. 增加了react父子组件之间的通信

3.3 React-redux

  1. 父组件中创建store,用<Provider store={store}></Provider>包裹子组件
ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>, 
  document.getElementById('root')
);
  1. mapStateToProps,mapDispatchToProps两个函数将Provider传入的store接收,导出子组件时用connect函数,使得子组件的props接收state和dispatch。
  2. 不需要subscribe(render)了
import React, { Component } from 'react';
import { connect } from "react-redux";


class App extends Component {
  add1IfOdd(){
    if(this.props.n %2 === 1){
      this.props.add1()
    }
  }
  render() {
    return (
      <div>
        你点击了 <span id="value">{this.props.n}</span> 次
        <div>
          <button id="add1" onClick={()=> this.props.add1()}>+1</button>
          <button id="add2" onClick={()=> this.props.add2()}>+2</button>
          <button id="add1IfOdd"  onClick={()=>{this.add1IfOdd()}}>如果是单数就+1</button>
          <button id="add1After2Sec">两秒钟后+1</button>
        </div>
      </div>
    );
  }
}

function mapStateToProps(state){
  return {
    n: state.n
  }
}
function mapDispatchToProps(dispatch) {
  return {
    add1: ()=> dispatch({type:'add', payload: 1}),
    add2: ()=> dispatch({type: 'add',payload: 2})
  }
}

export default connect(mapStateToProps,mapDispatchToProps)(App);

4. Context API 的使用

主要应用于不同层级的组件需要访问同样的数据,使用context可以避免通过中间元素传递props。

// Context 可以让我们无须明确地传遍每一个组件,就能将值深入传递进组件树。
// 为当前的 theme 创建一个 context(“light”为默认值)。
const ThemeContext = React.createContext('light');

class App extends React.Component {
  render() {
    // 使用一个 Provider 来将当前的 theme 传递给以下的组件树。
    // 无论多深,任何组件都能读取这个值。
    // 在这个例子中,我们将 “dark” 作为当前的值传递下去。
    return (
      <ThemeContext.Provider value="dark">
        <Toolbar />
      </ThemeContext.Provider>
    );
  }
}

// 中间的组件再也不必指明往下传递 theme 了。
function Toolbar(props) {
  return (
    <div>
      <ThemedButton />
    </div>
  );
}

class ThemedButton extends React.Component {
  // 指定 contextType 读取当前的 theme context。
  // React 会往上找到最近的 theme Provider,然后使用它的值。
  // 在这个例子中,当前的 theme 值为 “dark”。
  static contextType = ThemeContext;
  render() {
    return <Button theme={this.context} />;
  }
}

5. Hooks API 的使用

Hook 是 React 16.8 的新增特性。它可以让你在不使用 class 组件的情况下使用 state 以及其他的 React 特性。

  • useState

  • useEffect
    当你调用 useEffect 时,就是在告诉 React 在完成对 DOM 的更改后运行你的“副作用”函数。由于副作用函数是在组件内声明的,所以它们可以访问到组件的 props 和 state。默认情况下,React 会在每次渲染后调用副作用函数 —— 包括第一次渲染的时候。

6. React Router

核心代码

ReactDOM.render(
  <Router>
    <div>
      <div>
        <Link to="/">
          <button>首页</button>
        </Link>{" "}
        |<Link to="/login">登录</Link> |<Link to="/signup">注册</Link> |
        <Link to="/welcome">欢迎</Link>
      </div>
      <Route path="/" exact component={App} />
      <Route path="/login" component={Box2} />
      <Route path="/signup" component={Box1} />
      <Route path="/welcome" component={Welcome} />
    </div>
  </Router>,
  rootElement
);

7. React的生命周期

查阅文档
常见面试题目见笔记。

8. CSS in React

普通应用使用 styled-components 和 css modules,因为类名会变成随机字符串,
库使用传统 CSS 方式,因为类名不会变成随机字符串。

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

推荐阅读更多精彩内容