Mi gerente estatal para React, Preact, Inferno

Me encanta reinventar bicicletas y otros artículos útiles. No siempre funciona bien, pero el proceso es interesante. Llamo su atención sobre la biblioteca de administración estatal para React, Preact (peso solo 4.8Kb). La biblioteca aún está en desarrollo, pero ya puedes probarla.





Comencemos con un ejemplo del organizador TODO favorito de todos. Código fuente en github . Primero, creemos el componente principal main.js.





// main.js
import React, { createElement, Component, createContext } from 'react';
import ReactDOM from 'react-dom';
import {Connect, Provider} from './store'
import Input from './InputComp'
import TodoList from './TodoList'
import LoadingComp from './LoadingComp'

const Main = () => (
  <Provider>
    <h1>Todo:</h1>
    <LoadingComp>
      <TodoList/>
    </LoadingComp>
    <hr/>
    <Input/>
  </Provider>
)

ReactDOM.render(<Main />, document.getElementById("app"));
      
      



Otro lado. Necesitamos la tienda para inicializar la biblioteca, y aquí también especificamos todos los archivos necesarios con acciones. En nuestro ejemplo, estos son actions.js y actionsSetup.js





// store.js

import React, { createElement, Component, createContext } from 'react';
import createStoreFactory from 'redoor';

//     actions.js  actionsSetup.js
import * as actions from './actions'
import * as actionsSetup from './actionsSetup'

//       React
const createStore = createStoreFactory({
  Component, 
  createContext, 
  createElement
});

//         
//    
const { Provider, Connect } = createStore([
  actions,
  actionsSetup
]);

export { Provider, Connect };
      
      







// actions.js

//         
// redoor     
// initState       ,
//   ,     
export const initState = {
    todos:[],
    value:'',
}

//     
//  state -   
//  args -      
//     
export const a_enter = ({state,args}) => {
  let {value,todos} = state;
  todos.push({
    id:(Math.random()+"").substr(2),
    value:value,
    done:false
  });
  return {
    value:'',
    todos
  }
}

//    
export const a_done = ({state,args}) => {
  let {todos} = state;
  let id = args.id;
  todos = todos.map(it=>(it.id === id ? (it.done = !it.done, it) : it))
  return {
    todos
  }
}

//    
export const a_delete = ({state,args}) => {
  let {todos} = state;
  let id = args.id;
  todos = todos.filter(it=>it.id !== id)
  return {
    todos
  }
}
      
      







// InputComp.js
import React from 'react';
import {Connect} from './store'

// redoor     cxRun   
//  
const Input = ({cxRun, value})=><label className="input">
  Todo:
  
  //        
  <input onChange={e=>cxRun({value:e.target.value})} 
					value={value} 
					type="text" 
  />
  
  //     a_enter   actions.js
  <button onClick={e=>cxRun('a_enter')} disabled={!value.length}>
		ok
	</button>
</label>

//   redoor     
export default Connect(Input);
      
      



cxRun . , actions.js.





.





// TodoList.js
import React from 'react';
import {Connect} from './store'

const Item = ({cxRun, it, v})=><div className="item">
  //   a_done,      
  //         args
  <div className="item_txt" onClick={e=>cxRun('a_done',it)}>
    {v+1}) {it.done ? <s>{it.value}</s> : <b>{it.value}</b>}
  </div>
  <div className="item_del" onClick={e=>cxRun('a_delete',it)}>
    &times;
  </div>
</div>

const TodoList = ({cxRun, todos})=><div className="todos">
  {
    todos.map((it,v)=><Item key={v} cxRun={cxRun} it={it} v={v}/>)
  }
</div>

export default Connect(TodoList);
      
      



. value todos. initState actions.js. initState , . , .





-- "_" "action". cxRun. state args.





state --





args -- cxRun. cxRun('a_delete', it), , args.





, .





? setState actions.js bindStateMethods.





//actions.js
let __setState;
let __getState;

//     
export const bindStateMethods = (getState, setState) => {
  __getState = getState;
  __setState = setState;
};

export const a_setup = async ({state,args}) => {
  __setState({loading:true});
  let data = await loading();
  __setState({
    loading:false,
    todos:data
  })
}
      
      



"a_load", , . , __getState .





Debugger

redoor-devtool. redoor localhost:8333. , . .





redoor-devtool:





yarn add redoor-devtool
      
      







npx redoor-devtool -o
      
      



la tecla "-o" abrirá Chrome en http: // localhost: 8333 , donde estará el depurador.





Conclusión

En mi propio nombre, puedo compartir que ya he realizado varios proyectos utilizando esta biblioteca. Fue muy conveniente trabajar con él en un proyecto con sockets. Por supuesto, existen características de uso. Por ejemplo, recuerde que todas las acciones son "visibles" desde todos los módulos. Esto no será un problema si tiene una estructura clara para nombrar sus acciones. En mis proyectos utilizo este nombre "a_moduleName_actionName".





Eso es todo por ahora. Si hay interés, intentaré escribir una reseña más detallada.








All Articles