alibaba / formily

📱🚀 🧩 Cross Device & High Performance Normal Form/Dynamic(JSON Schema) Form/Form Builder -- Support React/React Native/Vue 2/Vue 3
https://formilyjs.org/
MIT License
11.48k stars 1.49k forks source link

[Bug Report] Schema 中的 scope 变量, {{}}用法属性表达式不跟随数据联动 #3424

Closed charlzyx closed 2 years ago

charlzyx commented 2 years ago

Reproduction link

Edit on CodeSandbox

Steps to reproduce

https://user-images.githubusercontent.com/18055018/192175833-1306cce9-0239-4f44-a9b7-6226098fa571.mov

直接表现是这样的:

拖动列表中第一行或者最后一行到其他位置, 其中 AM I TOP、AM I BOTTOM, $index 三个字段的值没有响应更新,这三列的值是通过这样的 schema {{}} 双括号表达式写的

// top

{
 "x-value": "{{$index===0 ?'TOP':''}}",
 "x-value": "{{$index===$records.length -1  ?'BOTTOM':''}}"
 "x-value": "{{$index}}"
}

所以根本原因可能是 Schema ExpressionScope 注入的值, 在表达式中使用的话, 不会响应式的更新?还是说除非是在 x-reactions 中使用,否则不保证会响应式触发更新

What is expected?

Schema 中的 {{}} 表示能够响应 scope 中的变化, 即 其中 第一、二列的 AM I TOP、AM I BOTTOM 锁定在第一、最后, $index 随着拖动更新

What is actually happening?

TOP、BOTTOM 两个字段随着行数据移动, 没有根据表达式实时计算

Package

@formily/antd@2.2.5


janryWang commented 2 years ago

$index不是响应式数据,你这个场景应该用Text组件,受控渲染就行了

frehaiku commented 2 years ago

@janryWang $index 需要弄成响应式的,场景:上移按钮index === 0时置灰,同等下移按钮 index === $records.length - 1 时也需要置灰

janryWang commented 2 years ago

解决方案,把依赖$index的逻辑改成,依赖$self.index,这个是响应式的,看来是我大意了,给了$index,这个是没法响应式的