当前位置: 首页 > news >正文

给 smox 加上翅膀,不断进步的 react 状态管理

halo 大家好,我是 132

这段时间,一直沉迷 smox 的迭代,然后又发布新版本了

上一篇文章(查看这里),已经简单阐述了 smox ,文章中也有人提到中间件机制,今天这篇文章可能稍稍复杂些,主要是 smox 两个机制

model 机制

smox 提供 model 机制用于业务逻辑的拆分,应对大型项目

类似的机制同类工具也存在,如 vuex 的 modules、dva 的 model 机制

smox 的 model 机制大概是这样的:



const sex = {
  state: {
    sex: 'boy'
  },
  mutations: {
    change(state, payload) {
      state.sex = payload
    }
  },
  actions: {
    asyncChange({ commit }, payload) {
      setTimeout(() => {
        commit('change', payload)
      }, 1000)
    }
  }
}

const store = new Store({ sex })


可以看到,和 dva 还是神似的,只不过不需要写 namespace,因为 smox 内部做了处理

此时,我们就可以通过store.commit('sex/change')来直接调用 sex model 下面的 change 方法了

组件内怎样使用呢?


import { map } from 'smox'

@map({
  state: ['sex/sex'],
  mutations: ['sex/change'],
  actions: ['sex/asyncChange']
})

class App extends React.Component {
  render() {
    return (
      <div>
        <h1>现在是{this.props.sex}</h1>
        <button onClick={this.props.change('girl')}>变性</button>
        <button onClick={this.props.change('girl')}>异步变性</button>
      </div>
    )
  }
}

export default App

是的,没有看错,仍然是使用 @map 语法糖,其实单纯实现 dispatch('model/action') 是很简单的,难点就在于封装 map (对应他们的 connect)



@connect(({modalName,loading})=>({
modelName,
loading:loading.effects['modelName/action],
}))

上面这段代码是 dva 的 connect ,不难发现,如果用了 model 机制,这个语法糖就会变得惨不忍睹

而 smox 在这方面还是很重视的,毕竟我是个 API 程序员

好啦,model 机制差不多就这样了,我们来看看中间件机制吧!

中间件机制

所谓的中间件机制,洋葱模型,其实就是 有个 next 函数可以 return 另一个函数

smox 的中间件也是这样,而且和 redux 神似,定制一个 smox 中间件也是同样的:


export const logger = ({state}) => (next) => (mutation,payload) =>{
  console.group('before',state)
  next(mutation,payload)
  console.log('after', state)
    console.groupEnd()
}

const store = new Store({ sex },[logger])

有了中间件,理论上我们就可以做很多事情了

最近迭代出 model 和 middleware 两个机制,也使得 smox 成为更好的状态管理方案

我坚信,smox 的机制、颜值,是目前最合理的方案之一

但是距离成为终极解决方案还需要继续进步!

总结

最后,smox 还会继续努力,欢迎试用与 star

源码地址:参见 github

附上文档: smox-document




原文发布时间为:2018年07月03日
原文作者:132
本文来源:  掘金  如需转载请联系原作者



相关文章:

  • expect(spawn) 自动化git提交和scp拷贝---centos(linux)
  • new和delete
  • 论文笔记系列-Neural Architecture Search With Reinforcement Learning
  • Linux iptables命令
  • Dubbo2.7源码分析-Dubbo是如何整合spring-framework的
  • Mozilla推出兼容iOS的Face ID密码管理器Firefox Lockbox
  • Shareinstall——精确监测与推广APP的完美神器!
  • OpenJ_Bailian 7617 输出前k大的数
  • Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什么的?有什么区别?...
  • CSS选取第几个标签元素:nth-child、first-child、last-child
  • Kotlin 1.3 新特性抢先看,协程已稳定并将向后兼容
  • 第一章 Java多线程技能
  • Visual Studio 2017 设置透明背景图
  • 实现rsync远程同步效果展示
  • 因为阿里,他们成了“杭漂”
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • android 一些 utils
  • Angular Elements 及其运作原理
  • Github访问慢解决办法
  • iOS 系统授权开发
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • js如何打印object对象
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux后台研发超实用命令总结
  • PHP CLI应用的调试原理
  • Python学习笔记 字符串拼接
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Windows Containers 大冒险: 容器网络
  • 回流、重绘及其优化
  • 如何学习JavaEE,项目又该如何做?
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 实战|智能家居行业移动应用性能分析
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 我的业余项目总结
  • 新版博客前端前瞻
  • 新手搭建网站的主要流程
  • ![CDATA[ ]] 是什么东东
  • (3)STL算法之搜索
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (论文阅读30/100)Convolutional Pose Machines
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (四)汇编语言——简单程序
  • (一) springboot详细介绍
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Core 中插件式开发实现
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .Net 知识杂记
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • @EventListener注解使用说明
  • @ModelAttribute注解使用