Tencent / tmagic-editor

Other
4.22k stars 714 forks source link

通过代码块来修改dsl中的节点样式以后,调用setConfig无法重新生效 #615

Closed niuhangkai closed 5 months ago

niuhangkai commented 5 months ago

版本:1.3.0-beta.2 步骤:

  1. playground中添加文本组件
  2. 对文本组件添加created钩子函数,执行一个代码块
  3. 代码块中操作为,forEach遍历的app.dsl下的所有节点中的style对象赋值css属性,比如color等。最后调用 app.setConfig(dsl)传入dsl根节点去更新,此时runtime和playground看上去样式没任何变化。app.transformStyle({})也尝试调用过不生效

请问一下这里是还需要什么操作才可以生效?因为有一些样式需要动态从其他地方获取,所以不能提前在样式中选择好

jia000 commented 5 months ago

是在app.dsl这个对象上做修改的吗?试试生成一个新对象app.setConfig(dsl)dsl为新对象而不是app.dsl

niuhangkai commented 5 months ago

是在app.dsl这个对象上做修改的吗?试试生成一个新对象app.setConfig(dsl)dsl为新对象而不是app.dsl

image

抱歉,这里漏描述了一点,我这里执行app.setConfig(dsl),在代码块created中是异步执行的,不是同步。同步执行可以生效。 也尝试过promise image

jia000 commented 5 months ago

直接修改是没办法触发响应式更新的,尤其是style,vue中应该是做了特殊处理的,可以使用map

items.map((item) => {
  return {
    ...item,
   style: {
      backgroundColor: 'blue',
     ...item.style
   }
  }
})
niuhangkai commented 5 months ago

找到问题答案了,在深拷贝dsl调用app.setConfig之后,还要在runtime中对app监听page-change事件,重新给pageConfig.value赋值。感谢你的回答