├── .gitignore
├── README.md
├── highOrderComponent
├── Password.js
├── UserName.js
├── high.js
└── index.js
├── react-redux.js
├── redux.js
└── render.js
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | node_modules
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # react内部一些方法和原理的简易实现
2 | - ReactDOM.render方法简易实现
3 | - redux createstore简易版
4 | - redux combineReducers方法
5 | - 高阶组件的实现(达到组件复用的目的)
6 | - react-redux简易实现(基于react16.3 的context来实现的)
7 |
--------------------------------------------------------------------------------
/highOrderComponent/Password.js:
--------------------------------------------------------------------------------
1 | import React, {Component} from 'react'
2 | import high from './high'
3 |
4 | class Password extends Component {
5 | render() {
6 | return (
7 |
8 |
9 |
10 | )
11 | }
12 | }
13 |
14 | export default high('password')(Password)
--------------------------------------------------------------------------------
/highOrderComponent/UserName.js:
--------------------------------------------------------------------------------
1 | import React, {Component} from 'react'
2 | import high from './high'
3 | class UserName extends Component {
4 |
5 |
6 |
7 |
8 | render() {
9 | return (
10 |
11 |
12 |
13 | )
14 | }
15 | }
16 | export default high('username')(UserName)
--------------------------------------------------------------------------------
/highOrderComponent/high.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | let high=(key)=>(Component)=>{
3 | return class HighOrderComponent extends React.Component{
4 | state = {value: ''}
5 | componentWillMount() {
6 | let result = localStorage.getItem(key)
7 | this.setState({value: result})
8 | }
9 | render(){
10 | return
11 | }
12 | }
13 | }
14 | export default high;
--------------------------------------------------------------------------------
/highOrderComponent/index.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react'
2 | import ReactDOM from 'react-dom'
3 | import UserName from "./UserName";
4 | import Password from "./Password";
5 |
6 | ReactDOM.render(,document.getElementById('root'))
10 |
--------------------------------------------------------------------------------
/react-redux.js:
--------------------------------------------------------------------------------
1 | //{Provider,connect}
2 | import React from 'react'
3 | import {bindActionCreators} from 'redux'
4 | let {Provider:Pro,Consumer}=React.createContext();
5 | //Provider 中有一个属性 store
6 | class Provider extends React.Component {
7 | render() {
8 | return
9 | {this.props.children}
10 |
11 | }
12 | }
13 |
14 | let connect = (mapStateToProps, mapDispatchToProps) => (Component) => {
15 | return class Proxy extends React.Component {
16 | render() {
17 | return (
18 |
19 | {(store)=>{
20 | console.log(store);
21 | // let state=mapStateToProps(store.getState())
22 | // let actions=mapDispatchToProps(store.dispatch)
23 | // //状态变化后 需要更新视图 调用this.setState()
24 | //
25 | // return
26 | class High extends React.Component{
27 | state=mapStateToProps(store.getState())
28 | componentDidMount(){
29 | console.log(this.state);
30 | this.unsub=store.subscribe(()=>{
31 | this.setState(mapStateToProps(store.getState()))
32 | })
33 | }
34 | componentWillUnmount(){
35 | this.unsub();
36 | }
37 | render(){
38 | // let actions=mapDispatchToProps(store.dispatch)
39 | let actions;
40 | if(typeof mapDispatchToProps==='function'){
41 | actions=mapDispatchToProps(store.dispatch)
42 | }else{//actions是对象
43 | actions=bindActionCreators(mapDispatchToProps,store.dispatch);
44 | }
45 | return
46 | }
47 | }
48 | return
49 | }}
50 |
51 |
52 | )
53 | }
54 | }
55 | }
56 | export {Provider,connect}
57 |
--------------------------------------------------------------------------------
/redux.js:
--------------------------------------------------------------------------------
1 | function createStore(reducer) {
2 | let state;
3 | let listeners=[];
4 | let getState=()=>JSON.parse(JSON.stringify(state));
5 | let dispatch=(action)=>{
6 | state=reducer(state,action)
7 | listeners.forEach(listener=>listener())
8 | }
9 | dispatch({});
10 | let subscribe=(listener)=>{
11 | listeners.push(listener);
12 | return ()=>{
13 | listeners=listeners.filter(fn=>fn!==listener)
14 | }
15 | }
16 | return {getState,dispatch,subscribe}
17 | }
18 | function combineReducers(reducers) {
19 | return (state={},action)=>{
20 | //默认要返回一个状态
21 | let obj={};
22 | for(let key in reducers){
23 | let reducer=reducers[key];
24 | console.log(key,state,state[key]);
25 | let s= reducer(state[key],action)
26 | obj[key]=s;
27 | }
28 | return obj;
29 | }
30 | }
31 | export {createStore,combineReducers}
32 |
--------------------------------------------------------------------------------
/render.js:
--------------------------------------------------------------------------------
1 | class Element{
2 | constructor(type,props){
3 | this.type=type;
4 | this.props=props;
5 | }
6 | }
7 | let React={
8 | createElement(type,props,...children){
9 | if(children.length===1){
10 | children=children[0]
11 | }
12 | return new Element(type,{...props,children})
13 | }
14 | }
15 | console.log(React.createElement("h1", {className: "red"}, "hello","jerry"));
16 | let ele=React.createElement("h1", {className: "red"}, "hello","jerry")
17 | function render(eleObj,container) {
18 | let {type,props}=eleObj;
19 | let ele=document.createElement(type);
20 | for(let key in props){
21 | if(key!=='children'){
22 | if(key==='className'){
23 | ele.setAttribute('class',props[key]);
24 | }else{
25 | ele.setAttribute(key,props[key]);
26 | }
27 | }else{//children
28 | let children=props[key];
29 | if(Array.isArray(children)){
30 | //是数组
31 | children.forEach(child=>{
32 | if(child instanceof Element){
33 | render(child,ele);
34 | }else{
35 | //文本节点
36 | ele.appendChild(document.createTextNode(child))
37 | }
38 | })
39 | }else{
40 | if(children instanceof Element){
41 | render(children,ele);
42 | }else{
43 | //文本节点
44 | ele.appendChild(document.createTextNode(children))
45 | }
46 | }
47 |
48 | }
49 | }
50 | container.appendChild(ele)
51 | }
52 | render(ele,window.root)
--------------------------------------------------------------------------------