feat(渲染编辑): 修复保存、文字与渲染问题
build.yaml / build (push) Successful in 40s

This commit is contained in:
xiaoqidun committed 2026-09-23 21:05:47 +08:00
1 parent 580e7043c4
commit d6f70de7be
40 files changed
+2299 -407

No files matched your search

+27 -2
View File
@@ -190,7 +190,7 @@ func WithRenderBackends(backends RenderBackends) RendererOption {
}
}
// sameBackend 判断可比较值配置是否未变,指针配置重新应用时刷新可变状态
// sameBackend 判断不可变值配置是否未变,包含指针的配置重新应用时刷新可变状态
// 入参: left 原后端, right 新后端
// 返回: bool 是否为同一配置
func sameBackend(left, right Backend) bool {
@@ -198,7 +198,32 @@ func sameBackend(left, right Backend) bool {
return left == nil && right == nil
}
a, b := reflect.ValueOf(left), reflect.ValueOf(right)
return a.Kind() != reflect.Pointer && b.Kind() != reflect.Pointer && a.Comparable() && b.Comparable() && left == right
return a.Comparable() && b.Comparable() && left == right && immutableBackendValue(a)
}
// immutableBackendValue 检查嵌套配置是否仅包含不可变值,不绑定具体后端类型
// 入参: value 配置值
// 返回: bool 是否可按值比较复用
func immutableBackendValue(value reflect.Value) bool {
switch value.Kind() {
case reflect.Pointer, reflect.UnsafePointer, reflect.Chan, reflect.Map, reflect.Slice, reflect.Func:
return false
case reflect.Interface:
return value.IsNil() || immutableBackendValue(value.Elem())
case reflect.Struct:
for i := range value.NumField() {
if !immutableBackendValue(value.Field(i)) {
return false
}
}
case reflect.Array:
for i := range value.Len() {
if !immutableBackendValue(value.Index(i)) {
return false
}
}
}
return true
}
// Backends 返回当前后端配置副本,可修改后通过WithRenderBackends应用