学习总结:React redux & Hook redux

336 阅读2分钟

前言:根据不完全统计:”一个网站能留住一名用户的时间只有 8S,如果你在 8S 内不能吸引住用户,或者网站出现了问题,那么你将彻底地丢失这名用户!”

一、React redux

1、为什么要使用 redux ? 在 React 中,我们将状态存在每个组件的 this.state 中,每个组件的 state 为组件所私有,如果要在一个组件中操作另外一个组件,实现起来是相当繁琐的。如果 组件B 想要改变 组件C 的状态时,就需要层层传递相关一些变量或者方法,假如这两个组件的层级都很深,就会导致中间过程中所有组件都会触发重新渲染,造成了巨额的开销。组件B<--...--组件A---...-->组件C

2、安装redux、react-redux

npm install redux
npm install react-redux

3、关键词

  • App.tsx文件
// app.tsx 引入 createStore 和Provider
import { createStore } from "redux";
import { Provider } from "react-redux";
...

// 创建 Store 的初始状态数据
const initialState = {
    todos: [{      
            id: 1,      
            text: "你好, 图雀",      
            completed: false    
        }],
    filter: false
};
...

const rootReducer = (state, action) => {  
    return state;
};
...

// `createStore` 函数,传入定义的 `rootReducer` 和 `initialState`
const store = createStore(rootReducer, initialState);
...

ReactDOM.render( 
// 使用 Provider 包裹 App 组件 ,并接收 store,这样子组件就可以访问 store 中的状态
    <Provider store={store}>    
        <App />  
    </Provider>,  
document.getElementById("root"));
  • 子组件
// 引入 connect
import { connect } from "react-redux"; 

class App extends React.Component { 
render() {    
    // 直接使用 store 中的属性
    const { todos, filter } = this.props;
    return (      
            ...
       );  
    }  
} 

// mapStateToProps函数:同时操作组件的原 `props` 和 Store 的状态,然后合并成最终的组件 props
const mapStateToProps = (state, props) => ({  
    todos: state.todos,  
    filter: state.filter
}); 

/** 
`connect` 函数接收 `mapStateProps` 函数,获取 `mapStateProps` 返回的最终组合后的状态,
 然后将其注入到 `App` 组件中,返回一个新的组件,然后交给 `export default` 导出。
 */
export default connect(mapStateToProps)(App);
  • 创建 src/actions/index.ts
let nextTodoId = 0;
export const addTodo = text => ({  
    type: "ADD_TODO",  
    id: nextTodoId++,  
    text
});
  • 组件中使用 action
import { connect } from "react-redux";
import { addTodo } from "../actions";

const AddTodo = ({ dispatch }) => {  
      let input;
      return (    
      <div>      
      <form onSubmit={e => {          
          e.preventDefault();          
          if (!input.value.trim()) {            
              return;          
          }         
            dispatch(addTodo(input.value));          
            input.value = "";        
          }}>        
          <input ref={node => (input = node)} />        
          <button type="submit">Add Todo</button>      
       </form>    
       </div>  
    );
};

/**
`connect` 函数,它负责将 Store 中的状态注入组件的同时,还给组件传递了一个额外的方法:`dispatch`,
这样我们就可以在组件的 `props` 中获取这个方法
*/
export default connect()(AddTodo);
  • Reducers 创建 src/index.js
// 定义 rootReducer
const rootReducer = (state, action) => {  
    switch (action.type) {    
    case "ADD_TODO": {      
    const { todos } = state;
    return {        
      ...state,        
      todos: [          
          ...todos,          
          {            
              id: action.id,            
              text: action.text,            
              completed: false          
          }]      
      };    
    }    
    default:      
        return state;  
    }
};

详细链接:mp.weixin.qq.com/s?__biz=MzA…