react-redux немного понятно, я так тупо понимаю!

Redux

1. Справочник

  • Введение в редукс
  • кейс
  • Введение в ядро ​​React-Redux

2. Введение в редукс

  • Redux является членом семейства React Bucket, которое пытается обеспечить механизм «предсказуемого управления состоянием» для приложений React.

  • Redux хранит все состояние приложения в одном месте, называемом хранилищем.

  • Сохраняет дерево состояний (дерево состояний)

  • Компоненты могут отправлять действия в хранилище вместо того, чтобы уведомлять другие компоненты напрямую.

  • Другие компоненты могут обновлять свои представления, подписываясь на состояние в магазине.

3. Установка

npm install --save redux

4. редукционное ядро

4.1 State

состояние представляет собой набор данных

Его можно понимать как сырье, необходимое фабрике для обработки товаров.

4.2 action

Изменения в состоянии приведут к изменениям в представлении. Однако пользователь не может касаться состояния, а только представления, поэтому изменение состояния должно быть вызвано представлением.

Действие — это инструкция по изменению состояния, а действий столько же, сколько действий по манипулированию состоянием.

Действия можно понимать как индикаторы, которые описывают, что произошло

4.3 функция обработки редуктора

После того, как действие выдает команду, оно помещает состояние в функцию обработки reucer и возвращает новое состояние.Можно понимать как обрабатывающую машину

4.4 store

магазин можно понимать как общую фабрику с несколькими обрабатывающими машинами

let store = createStore(reducers);

Магазин — это объект, который их связывает. Магазин имеет следующие обязанности:

维持应用的 state;
提供 getState() 方法获取 state;
提供 dispatch(action) 方法更新 state;
通过 subscribe(listener) 注册监听器;
通过 subscribe(listener) 返回的函数注销监听器。

Мы можем узнать статус товара на фабрике через store.getState(), Используйте store.dispatch для отправки команд действий.

5. Классический чехол

Это классический случай редукции

  • Определите функцию редуктора для изменения состояния в соответствии с типом действия.
  • действия определяют директивы
  • Создайте магазин с помощью createStore
  • Вызовите store.dispatch(), чтобы выполнить команду для изменения состояния.
import { createStore } from 'redux'

const reducer = (state = {count: 0}, action) => {
  switch (action.type){
    case 'INCREASE': return {count: state.count + 1};
    case 'DECREASE': return {count: state.count - 1};
    default: return state;
  }
}

const actions = {
  increase: () => ({type: 'INCREASE'}),
  decrease: () => ({type: 'DECREASE'})
}

const store = createStore(reducer);

store.subscribe(() =>
  console.log(store.getState())
);

store.dispatch(actions.increase()) // {count: 1}
store.dispatch(actions.increase()) // {count: 2}
store.dispatch(actions.increase()) // {count: 3}

Мы можем использовать store.dispatch прямо на реагирующем компоненте, но это неудобно, в это время нам нужен react-redux

class Todos extends Component {
    render(){
        return(
            <div onCLick={()=>store.dispatch(actions.delTodo()) }>test</div>
        )
    }
}

6. react-redux

Официальная библиотека привязки React, предоставленная Redux. Эффективный и гибкий.

6.1 Установка

npm install --save react-redux

6.2 Ядро

  • < Provider store>
  • connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])

Если какой-либо компонент в Provider (такой как Comp здесь) должен использовать данные в состоянии, он должен быть «подключенным» компонентом — «компонент, который вы написали (MyComp)», обернут с использованием продукта метода подключения.

Эта функция позволяет нам привязать данные из хранилища в качестве реквизита к компоненту.

Простой процесс показан на следующем рисунке:

Метод connect в react-redux оборачивает getState и отправляет хранилище в реквизиты компонента.

Измените код отправки непосредственно в компоненте следующим образом:

index.js

import React, { Component } from 'react';
import store from '../store';
import actions from '../store/actions/list';
import {connect} from 'react-redux';

class Todos extends Component {
    render(){
        return(
            <div onCLick={()=>this.props.del_todo() }>test</div>
        )
    }
}

export default connect(
    state=>state,
    actions
)(Todos);

Провайдер может получить хранилище ключей и передать его каждому дочернему компоненту.

7. Как работает подключение?

connect() принимает четыре параметра: mapStateToProps, mapDispatchToProps, mergeProps и options.

7.1 mapStateToProps这个函数允许我们将 store 中的数据作为 props 绑定到组件上。

reducer.js

export default function (state = { lists: [{text:'移动端计划'}],newType:'all'}, action) {
    switch (action.type) {
        case types.ADD_TODO:
            return {...state,lists:[...state.lists,{text:action.text}]}
        case types.TOGGLE_TODO:
            return {...state,lists:state.lists.map((item,index)=>{
                if(index == action.index){
                    item.completed = !item.completed
                }
                return item
            })}
        case types.DEL_TODO:
            return {...state,lists:[...state.lists.slice(0,action.index),...state.lists.slice(action.index+1)]}
        case types.SWITCH_TYPE:
            console.log({...state,newType:action.newType})
            return {...state,newType:action.newType}
        default:
            return state;
    }
}

В reducer.js определено инициализированное состояние.Через метод подключения мы можем использовать this.props.lists для получения инициализированного состояния.

import React, { Component } from 'react';
import store from '../store';
import actions from '../store/actions/list';
import {connect} from 'react-redux';

class Todos extends Component {
    render(){
        return(
            {
                + <ul>
                +    this.props.state.lists.map(list =>(
                +        <li>{list.text}</li>
                +    ))
                + </ul>   
            }
            <div onCLick={()=>this.props.del_todo() }>test</div>
        )
    }
}

export default connect(
    state=>state,
    actions
)(Todos);

При изменении состояния или при изменении ownProps будет вызываться mapStateToProps для вычисления нового stateProps и обновления его до MyComp (после слияния с ownProps).

7.2 mapDispatchToProps(dispatch, ownProps): dispatchProps connect 的第二个参数是 mapDispatchToProps,它的功能是,将 action 作为 props 绑定到 MyComp 上。

action.js

import * as types from "../action-types";

export default{
    add_todo(text){
        return { type: types.ADD_TODO, text: text}
    },
    del_todo(idx){
        return {type:types.DEL_TODO, index: idx}
    },
    toggle_todo(index){
        return {type:types.TOGGLE_TODO, index}
    },
    del_todo(index){
        return {type:types.DEL_TODO, index}
    },
    switch_type(newType){
        return {type:types.SWITCH_TYPE, newType}
    }
}

Команда, которую я определяю в action.js для изменения состояния, станет реквизитом и привязана к компоненту reac через метод подключения mapDispatchToProps.

Мы можем легко использовать для вызова

    <div onCLick={()=>this.props.del_todo() }>test</div>

8. Идите вглубь

Зная это, мы обнаружим, что метод store.dispatch не используется для выдачи команд, но состояние было изменено, и вид изменился, так что же произошло?

store.dispatch(actions.increase())

Ключ подключения ()

Упрощенная версия принципа подключения

import React,{Component} from 'react';
import {bindActionCreators} from 'redux';
import propTypes from 'prop-types';

export default function(mapStateToProps,mapDispatchToProps){
   return function(WrapedComponent){
      class ProxyComponent extends Component{
          static contextTypes = {
              store:propTypes.object
          }
          constructor(props,context){
            super(props,context);
            this.store = context.store;
            this.state = mapStateToProps(this.store.getState());
          }
          componentWillMount(){
              this.unsubscribe = this.store.subscribe(()=>{
                  this.setState(mapStateToProps(this.store.getState()));
              });
          }
          componentWillUnmount(){
              this.unsubscribe();
          }
          render(){
              let actions= {};
              if(typeof mapDispatchToProps == 'function'){
                actions = mapDispatchToProps(this.store.disaptch);
              }else if(typeof mapDispatchToProps == 'object'){
                  console.log('object', mapDispatchToProps)
                actions = bindActionCreators(mapDispatchToProps,this.store.dispatch);
              }
                return <WrapedComponent {...this.state} {...actions}/>
         }
      }
      return ProxyComponent;
   }
}

1. Возврат состояния Для магазина, загруженного из предоставленного родительского компонента в соединении, верните статус, вернув статус

mapStateToProps(this.store.getState());

С помощью вспомогательной функции Redux bindActionCreators() используйте диспетчеризацию для мониторинга каждого действия.

 bindActionCreators(mapDispatchToProps,this.store.dispatch);

Поэтому, когда вызывается метод реквизита, событие store.dispach(XXX) будет автоматически инициировано, и будет выдана команда

Ссылка на простой пример проекта react-redux

Справочная статья

На этом анализ react-redux заканчивается, а о промежуточном программном обеспечении redux я продолжу писать позже!

Если вы думаете, что это весело, пожалуйста, обратите внимание ~ Добро пожаловать, чтобы собрать и написать комментарий ~~~

Объявление о вакансии

ByteDance набирает сотрудников!

Описание вакансии: Front-end development (senior) ToB направление - видео облако (База: Шанхай, Пекин)

1. Отвечает за производство мультимедийных услуг, таких как аудио и видео по запросу / прямая трансляция / общение в реальном времени и создание облачных платформ для бизнеса;

2. Отвечает за мультимедийную систему качества, эксплуатацию и техническое обслуживание, построение и развитие системы;

3. Хорошо разбирается в абстрактном дизайне, инженерном мышлении, фокусируется на взаимодействии и создает максимальный пользовательский опыт.

Профессиональные требования

1. Компьютеры, связь и электронная информатика и другие смежные специальности являются предпочтительными;

2. Владение различными фронтенд-технологиями, включая HTML/CSS/JavaScript/Node.js и т. д.;

3. Глубокое понимание языка JavaScript с использованием основных сред разработки, таких как React или Vue.js;

4. Приветствуется знание Node.js, понимание Express/KOA и других фреймворков, а также опыт разработки крупномасштабных серверных программ;

5. Иметь определенное представление о пользовательском опыте, интерактивной работе и анализе потребностей пользователей, а также иметь опыт разработки продуктов или интерфейсов;

6. Предпочтение отдается участникам со своими собственными техническими продуктами, работами с открытым исходным кодом или активным сообществом с открытым исходным кодом.

Основные моменты работы

Команда видеооблачных сервисов опирается на накопленные аудио- и видеотехнологии и базовые ресурсы Douyin, Xigua Video и других продуктов, чтобы предоставлять клиентам универсальные аудио- и видеомультимедийные услуги, включая аудио- и видеопо запросу, прямую трансляцию, реальную связь времени, обработка изображений и т. д. Внутренне, как центр видеотехнологий, он обслуживает внутренний бизнес; снаружи он создает готовые аудио- и видео-мультимедийные сервисные решения для обслуживания пользователей корпоративного уровня.

У команды есть стандартизированный процесс итерации проекта и идеальная конфигурация ролей проекта; сильная техническая атмосфера, охватывает сообщество открытого исходного кода и регулярно делится, так что каждый может быстро расти вместе с бизнесом и использовать технологии, чтобы изменить мир!

способ доставки

Резюме можно отправлять напрямую по адресу:yuanyuan.wallace@bytedance.com

Вы также можете отсканировать внутренний QR-код для доставки онлайн, с нетерпением жду вашего присоединения! ~