更简洁易用的 react 数据流 nearly-react
Nearly一个简洁,强大的数据流框架; Github 安装npm install --save nearly-react 特性
上图为 flux 架构图,Nearly 参考自 flux,在其基础上做了以下简化和改进: 功能上:
相比 flux:
使用示例import React from 'react'; import { render } from 'react-dom'; import {connect,dispatch,registerStore} from 'nearly-react'; registerStore('counter',{ // 必须实现 init 方法,它将被隐式调用,作用是初始化 state init() { return { count: 0 }; },add(getState,step) { return { count: getState().count + step }; } }; let incr = () => dispatch('counter::add',1); let decr = () => dispatch('counter::add',-1); function Counter(props) { return ( <div> <button onClick={incr}> - </button> <span>{props.count}</span> <button onClick={decr}> + </button> </div> ) } let HocCounter = connect('counter',Counter); render( <HocCounter />,document.getElementById('root') ) APIregisterStore(storeName,dispatcherSet)该方法将注册一个 registerStore('customStore',{ // 必须实现 init 方法 init() { return {sum: 0}; },num) { return {sum: getState().sum + num}; } }); Dispatcher functions(getState,...args)
对于
例: registerStore('counter',init 中也可以使用 Promise init() { return fetch('./test.json').then(res => res.json()); },step) { return { count: getState().count + step }; },// 异步增加 addAsync(getState,step) { return new Promise(resolve => { setTimeout(() => { // getState 方法返回的永远是最新的 state let count = getState().count + step; resolve({count}) },1000); }); },// 不触发渲染 nothing(getState,step) { return null; } }; dispatch(action,...args)默认配置的 dispatch 会根据 connect(storeName,Component [,PlaceHolder,isPure])该方法会根据 其中, 但组件过大时,可以通过设置 也可以通过下面的 进阶使用dispatcher(action,...args)即 dispatch('counter::add',1); 等同于: dispatcher('counter::add')(1); dispatch('test::testAdd',1,2,3,4); 等同于: dispatcher('test::testAdd',2)(3,4); configure(option)使用
默认配置如下: import {registerStore,getStore} from './store'; let config = { // 默认的 isPure defaultPure: false,// 默认不开启自动注册 Store beforeConnect(storeName) { // let store = getStore(storeName); // if (!store) { // let realName = storeName.split('#')[0]; // registerStore(storeName,require(`./actions/${realName}.js`)); // } },beforeDispatch(action) { let [storeName,dispatcherName] = action.split('::'); let store = getStore(storeName); if (!store) { throw Error(`store '${storeName}' does not exist`); } let dispatcher = store.dispatchers[dispatcherName]; if (!dispatcher) { throw Error(`the module does not export function ${dispatcherName}`); } return {store,dispatcher}; } } 使用示例: import {configure,getStore,registerStore} from 'nearly-react'; configure({ beforeConnect(storeName) { // 配置 beforeConnect 方法,自动注册 Store // 当 store 不存在时 // 自动去 actions 目录下加载 JS 模块,并注册 Store let store = getStore(storeName); if (!store) { let realName = storeName.split('#')[0]; registerStore(storeName,require(`./actions/${realName}.js`)); } } }); 同一 Store 单实例使用在业务中我们经常需要跨组件通信,或者组件间共享数据; 使用 Nearly 我们能很轻易地将两个不同的组件绑定相同的 registerStore('vm',作用是初始化 state init() { return { value: '' }; },change(getState,value) { return { return { value }; }; } }; // /components/Input.js let change = e => dispatch('vm::change',e.target.value); function Input(props) { return <input value={props.value} onChange={change} /> } export default connect(Input,'vm'); // /components/Text.js function Text(props) { return <p>{props.value}</p> } export default connect(Text,'vm'); 详见示例: One-store 同一 Store 多实例使用我们开发通用组件时会需要给同一组件绑定同一 // Dialog.js export default function Dialog (props){ return <div>{props.content}</div> } let DialogA = connect(Dialog,'dialog#a'); let DialogB = connect(Dialog,'dialog#b'); // 关闭弹窗 A dispatch('dialog#a::close'); // 关闭弹窗 B dispatch('dialog#b::close'); 注意,当在组件内部使用 详见示例: Dialog 示例
Tips
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |