Comments (6)
Reproduction link 显示 devBox not found, 看看链接是不是有问题?
from formily.
看标题描述应该与 #2794 这个问题相关。 可以通过 useField
获取 field 中获取到组件 props, 这个引用不会变
from formily.
Reproduction link 显示 devBox not found, 看看链接是不是有问题?
原链接是私有的,现在开放了
from formily.
看标题描述应该与 #2794 这个问题相关。 可以通过
useField
获取 field 中获取到组件 props, 这个引用不会变
对但vue的响应式系统下,props的引用地址变更也会触发watch effect。react我理解useEffect的dep也是简单的shallow diff。我觉得props地址是不能变更的,虽然两个对象打印后是一样。
源码是在packages/vue/src/components/ReactiveField.ts
originData对象里的value都是deep clone的,经过这个toJs这个函数处理
export const toJS = <T>(values: T): T => {
const visited = new WeakSet<any>()
const _toJS: typeof toJS = (values: any) => {
if (visited.has(values)) {
return values
}
if (values && values[RAW_TYPE]) return values
if (isArr(values)) {
if (isObservable(values)) {
visited.add(values)
const res: any = []
values.forEach((item: any) => {
res.push(_toJS(item))
})
visited.delete(values)
return res
}
} else if (isPlainObj(values)) {
if (isObservable(values)) {
visited.add(values)
const res: any = {}
for (const key in values) {
if (hasOwnProperty.call(values, key)) {
res[key] = _toJS(values[key])
}
}
visited.delete(values)
return res
}
}
return values
}
return _toJS(values)
}
from formily.
看标题描述应该与 #2794 这个问题相关。 可以通过
useField
获取 field 中获取到组件 props, 这个引用不会变对但vue的响应式系统下,props的引用地址变更也会触发watch effect。react我理解useEffect的dep也是简单的shallow diff。我觉得props地址是不能变更的,虽然值一样。
源码是在packages/vue/src/components/ReactiveField.ts originData对象里的value都是deep clone的,经过这个toJs这个函数处理
export const toJS = <T>(values: T): T => { const visited = new WeakSet<any>() const _toJS: typeof toJS = (values: any) => { if (visited.has(values)) { return values } if (values && values[RAW_TYPE]) return values if (isArr(values)) { if (isObservable(values)) { visited.add(values) const res: any = [] values.forEach((item: any) => { res.push(_toJS(item)) }) visited.delete(values) return res } } else if (isPlainObj(values)) { if (isObservable(values)) { visited.add(values) const res: any = {} for (const key in values) { if (hasOwnProperty.call(values, key)) { res[key] = _toJS(values[key]) } } visited.delete(values) return res } } return values } return _toJS(values) }
是的, vue是自带响应式的。 出现这个问题的原因是当前版本的 formily 在设计的时候,将响应式放在@formily/reactive 这一层了,没有利用 vue自身的能力。 目前 @formily/vue 中的 ReactiveField
实际上还是参考了 @formily/react 中的实现,vue 组件更像一个 functional Component, 是否重新渲染是由 reactive 层去控制的。 在你不脱离@formily/vue
去开发情况下,通过 provide/inject 可以规避这个问题。
from formily.
看标题描述应该与 #2794 这个问题相关。 可以通过
useField
获取 field 中获取到组件 props, 这个引用不会变对但vue的响应式系统下,props的引用地址变更也会触发watch effect。react我理解useEffect的dep也是简单的shallow diff。我觉得props地址是不能变更的,虽然值一样。
源码是在packages/vue/src/components/ReactiveField.ts originData对象里的value都是deep clone的,经过这个toJs这个函数处理export const toJS = <T>(values: T): T => { const visited = new WeakSet<any>() const _toJS: typeof toJS = (values: any) => { if (visited.has(values)) { return values } if (values && values[RAW_TYPE]) return values if (isArr(values)) { if (isObservable(values)) { visited.add(values) const res: any = [] values.forEach((item: any) => { res.push(_toJS(item)) }) visited.delete(values) return res } } else if (isPlainObj(values)) { if (isObservable(values)) { visited.add(values) const res: any = {} for (const key in values) { if (hasOwnProperty.call(values, key)) { res[key] = _toJS(values[key]) } } visited.delete(values) return res } } return values } return _toJS(values) }
是的, vue是自带响应式的。 出现这个问题的原因是当前版本的 formily 在设计的时候,将响应式放在@formily/reactive 这一层了,没有利用 vue自身的能力。 目前 @formily/vue 中的
ReactiveField
实际上还是参考了 @formily/react 中的实现,vue 组件更像一个 functional Component, 是否重新渲染是由 reactive 层去控制的。 在你不脱离@formily/vue
去开发情况下,通过 provide/inject 可以规避这个问题。
后续这个问题会修复吗?我这边可以先规避下
from formily.
Related Issues (20)
- scascader动态加载子集后,点击子集报错 HOT 1
- [Bug Report] 当表单中有两层数组嵌套时,void节点有可能出现在 formValues 中 HOT 2
- [Feature Request] formStep 组件支持强制渲染字段,在最后一步时也渲染其他步骤的字段。 HOT 1
- [Feature Request] 希望可以增加v-slot来指定表单组件渲染到指定插槽 或者 v-content可以支持schema配置表单
- [Bug Report] ArrayBase add remove 不触发onFieldValueChange更新
- [Bug Report] Formily设计器demo,组件响应器不可用 HOT 1
- [Feature Request] 希望 json-schema 中的 x-validator 判断增加值是否在 x-compile-omitted 中 HOT 2
- [Feature Request] @formily/antd-v5 暴露 ConfigProvider 用于自定义 antd prefixCls,从而避免 4、5 混用时样式污染。 HOT 1
- [Bug Report] field.insert 插入(非第一项和最后一项)内容后,path 内索引下标变成字符串 HOT 2
- [Bug Report] 字段使用x-visible切换时,重新输入会丢失字段问题 HOT 1
- List formily on json-schema.org HOT 1
- schema json模式下,同一个对象key对应不同的组件,组件切换时,依然会校验上次展示的组件 HOT 1
- [Bug Report] antdv5 FormDrawer.Extra和FormDrawer.Footer不起作用 HOT 3
- [Bug Report] antv5 arrayTable 无法固定列 HOT 2
- [Bug Report] ArrayItems 和 initialValues,ArrayItems显示隐藏后,initialValues的值变为[<1 empty slot>]
- [Bug Report] 调用ArrayItems.Remove后$index没有更新 HOT 3
- [Bug Report] [FormDrawer] antd 5.10.2升级至5.14.2后,FormDrawer footer和extra不生效,页面未渲染 HOT 2
- [Feature Request] vite中配置vite-plugin-imp按需引入,但有大量的scss引入 HOT 1
- [Feature Request] vite中配置vite-plugin-imp按需引入,未引入的组件,但有大量的scss引入
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 formily.