Comments (4)
考虑过这个问题。
如果做 code splitting 的话,就只能把需要的 model 在组件中都引入,然后 setModel()
注册,比如 home、counter 等,没什么特别好的解决方案。
所以这里只能推荐在项目设计上,把公共的部分提取成一个 "common" model,在上层引入,减少不同模块的相互依赖。
现在如果一个 model 在不同组件中注册,会进行提示,后续会考虑去除这个提示~
from flooks.
谢谢答复。
刚才特意去试了下dva里面的model设计,通过封装的redux-saga库的effects里面put关键字获取其他namespace的model,发现也是要先加载后,才会出现对应模块的model,
所以在有useModel('other')先保证已经存在就好了,先尝试在项目用一下吧,哈哈~
from flooks.
初步尝试了下我还是感觉setModel 这个用起来有点不舒服,更期望能和dva一样有个namespace类似的字段,来区分不同的模块,在加载这个model的时候就自动setModel(namespace, this);
我觉得dva那样做有个好处,这个model.js无论在哪里加载,他的namespace都固定,模块化更清晰,而现在手动引入再setModel给予模块名的话,是更灵活了,(逻辑相同的两个模块甚至可以引入同一个model.js 然后set不同的名字去使用),
但是同时也就是您上面说的
现在如果一个 model 在不同组件中注册,会进行提示,后续会考虑去除这个提示~
我觉得如果setmodel用同样的名字应该是不被允许的,因为现在存在相同名字的model,state里面有相同的字段的话,修改的同时会影响另一个,这在使用的时候无感知的;
同时您在掘金上的文章提到,dva的dispatch写在业务代码里面会很丑,诚然它并不漂亮,但是还是很清晰的,type指向了 那个模块的model及对应的action,payload紧随其后,而且最重要是一看到这个dispatch马上能反映到这部分的逻辑被放到了model里,逻辑分离的好的话,相当于分离了个service层出去,
flooks中 这部分道理和dva一致,甚至写起来不需要generate的写法,简洁,但是action是函数,名字定义随意一点的话,和普通的业务逻辑的函数是差不多的,
//page.jsx
//使用的时候
const { count, increment, decrement } = useModel('home');
useEffect(() => {
increment(payload)
}, [])
//假如我页面上也有个 const increment = xxxx
项目再越来越大的时候就会混在一起,分不清哪些是页面本身的函数,哪些是放在model处理了,
但是在dva
useEffect(() => {
dispatch({
type: 'profile/increment',
payload: { }
})
}, [])
不知道我表达清楚意思没有,就是dispatch虽然很丑,写起来很长
好吧写到这里我觉得这点有点那个了,名字定义好还是可以规避的;就当我没说吧 0.0
from flooks.
感谢建议~
1.
setModel()
一开始叫 createModel()
,确实考虑过 setModel(model)
的方案,然后 model 中添加 name
字段,这样设计与现有设计各有利弊。
现在这样显示声明 setModel(name, model)
中的 name,是为了让 useModel(name)
中 name 的来源更加「直观」,同时 model 中就只有 state
和 actions
两个字段,更「清晰」。
当然,加 namespace 的方案也有好处,只是觉得从 API 互相的「连贯性」上来说可能不太直观。想用 namespace 的方案,其实可以直接在 model.js 文件中:
export default setModel('someModel', {
state: {}
actions: ({ model, setState }) =>({})
})
然后组件中 import './model.js';
即可。
2.
「someModel 已存在」的提示已经去掉,主要是如果启用了 HMR,每次热更新都触发函数调用,提示就很多余。
setModel('someModel', model)
是可以在不同组件中都调用的,是为了支持本 issue 一开始提到的 code splitting 的情况。只要 name 一样,注册的都是"第一次"调用时注册的那个 model,后面的调用会忽略。
其实,同一个 model 文件比如 x,setModel('a', x)
和 setModel('b', x)
之后,只要更新数据不是 obj.foo.bar = 123
(深层数据),数据就不会互相影响,因为每次 setState()
都是给 state
一个新的对象,它会变成 "a" 和 "b" 两个 model,相当于一个 model 用于两个模块,算是一个 hack feature。
3.
dva 的显式调用 dispatch 的思路,各有利弊。Redux 也提供了 bindActionCreators()
函数,以供直接调用函数,而不是用 dispatch 调用,所以没有一定"对"的设计,只是思路的倾向。
加上 ESLint,函数组件中,命名冲突会报错。另外就是,其实可以这样使用 useModel()
:
const modelA = useModel('modelA');
const modelB = useModel('modelB');
// modeA.count
// modelA.increment()
不把 state 和 action 解构出来,这也算一种对不同变量加以区分的思路~
from flooks.
Related Issues (20)
- 性能 HOT 3
- 能否改造在 Taro 中使用 HOT 2
- 建议 HOT 3
- 好用吗,这个状态管理库? HOT 1
- 在React Native环境下使用会出现Navigator重置的现象 HOT 2
- flooks相对于redux的优势是什么? HOT 1
- Just a note to say... HOT 1
- 请教:是否更推荐model数据细粒度化? HOT 3
- state 能否替换成不可变数据 HOT 3
- Create a .npmignore HOT 1
- 有考虑加入“计算状态”的功能计划吗 HOT 1
- BugDemo HOT 2
- 直接 对对象的数据进行操作,更新有延迟 HOT 1
- 后续有添加 Context 支持计划吗? HOT 5
- 和resso 哪个更优质? HOT 1
- 在react 18 中 报错Missing getServerSnapshot, which is required for server-rendered content. Will revert to client rendering. HOT 1
- 如何在条件语句中或者事件回调函数中访问state HOT 1
- store的类型定义可以完善一下嘛 HOT 1
- 在事件中使用渲染时没有调用的值就会报错 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from flooks.