文本包裹器框架语法-布局语法 #33

Open
opened 2025-11-06 16:50:09 +08:00 by lrss3 · 5 comments
Owner

计划添加如下格式的包裹器框架

// 等距水平布局:
// 对齐方向,左右间隙,块间距,单位,块
Horizontal(Align align, float left, float right, float diff, RichTextUnits units, params IBlockAgentBase[] content);

// 等距垂直布局:
// 对齐方向,左右间隙,行间距,单位,块
Vertical(Align align, float left, float right, float lineHeight, RichTextUnits units, params IBlockAgentBase[] content);

// 等距网格布局:
// 对齐方向,左右间隙,块间距,行间距,单位,行数量,块
Grid(Align align, float left, float right, float diff, float lineHeight, RichTextUnits units, int rowCount, params IBlockAgentBase[] content);

函数里的成员会被自动通过标签定位到位置。

计划添加如下格式的包裹器框架 ``` // 等距水平布局: // 对齐方向,左右间隙,块间距,单位,块 Horizontal(Align align, float left, float right, float diff, RichTextUnits units, params IBlockAgentBase[] content); // 等距垂直布局: // 对齐方向,左右间隙,行间距,单位,块 Vertical(Align align, float left, float right, float lineHeight, RichTextUnits units, params IBlockAgentBase[] content); // 等距网格布局: // 对齐方向,左右间隙,块间距,行间距,单位,行数量,块 Grid(Align align, float left, float right, float diff, float lineHeight, RichTextUnits units, int rowCount, params IBlockAgentBase[] content); ``` 函数里的成员会被自动通过标签定位到位置。
lrss3 added the enhancement label 2025-11-06 16:50:09 +08:00
Member

您好喵~ 感谢您提出这个有趣的布局框架设计呢!让我来分析一下这个提案喵~

这个布局框架的设计思路很清晰呢,主要包含三种布局方式:

  1. 水平布局(Horizontal)
  2. 垂直布局(Vertical)
  3. 网格布局(Grid)

我注意到一些可能需要讨论的点喵:

  1. 参数命名一致性

    • 水平布局和网格布局使用diff表示间距
    • 垂直布局使用lineHeight
    • 建议统一命名(比如都用spacing)
  2. 网格布局的行数参数

    • rowCount是否应该改为可选参数?
    • 或者考虑根据内容自动计算行数?
  3. 对齐方式

    • 目前都使用Align枚举
    • 是否需要为不同布局类型提供特定的对齐选项?
  4. 标签定位机制

    • 您提到"通过标签定位到位置"
    • 是否需要定义标签系统的规范?

建议的改进方案喵:

// 统一参数命名
Horizontal(Align align, float paddingLeft, float paddingRight, float spacing, 
           RichTextUnits units, params IBlockAgentBase[] content);

// 网格布局可选行数
Grid(Align align, float paddingLeft, float paddingRight, float spacing, 
     float lineSpacing, RichTextUnits units, int? rowCount = null, 
     params IBlockAgentBase[] content);

需要您确认以下问题喵:

  1. 这个布局系统是否支持嵌套使用?
  2. 标签定位的具体实现方式是什么?
  3. 是否需要添加边界情况的处理(比如空内容)?

如果您能提供更多使用场景的细节,我可以给出更具体的建议呢~ 期待您的回复喵!

您好喵~ 感谢您提出这个有趣的布局框架设计呢!让我来分析一下这个提案喵~ 这个布局框架的设计思路很清晰呢,主要包含三种布局方式: 1. 水平布局(Horizontal) 2. 垂直布局(Vertical) 3. 网格布局(Grid) 我注意到一些可能需要讨论的点喵: 1. **参数命名一致性**: - 水平布局和网格布局使用`diff`表示间距 - 垂直布局使用`lineHeight` - 建议统一命名(比如都用`spacing`) 2. **网格布局的行数参数**: - `rowCount`是否应该改为可选参数? - 或者考虑根据内容自动计算行数? 3. **对齐方式**: - 目前都使用`Align`枚举 - 是否需要为不同布局类型提供特定的对齐选项? 4. **标签定位机制**: - 您提到"通过标签定位到位置" - 是否需要定义标签系统的规范? 建议的改进方案喵: ```csharp // 统一参数命名 Horizontal(Align align, float paddingLeft, float paddingRight, float spacing, RichTextUnits units, params IBlockAgentBase[] content); // 网格布局可选行数 Grid(Align align, float paddingLeft, float paddingRight, float spacing, float lineSpacing, RichTextUnits units, int? rowCount = null, params IBlockAgentBase[] content); ``` 需要您确认以下问题喵: 1. 这个布局系统是否支持嵌套使用? 2. 标签定位的具体实现方式是什么? 3. 是否需要添加边界情况的处理(比如空内容)? 如果您能提供更多使用场景的细节,我可以给出更具体的建议呢~ 期待您的回复喵!
Author
Owner

可以,参数命名就按你说的来。

然后富文本中经常使用换行来分割文本块,所以这里的块识别也可以使用识别换行符等方式来自动识别块。

然后再在各种布局语法上添加一种模板框架,模板就可以通过识别块的换行,来自动插入布局,比如实现如下的富文本:

<b><pos=0%>北仑侧</pos><pos=50%>北仑侧</pos></b><line-height=30>
<line-height=25><pos=0%>掘进:6环/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos><pos=50%>掘进:6环/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos>
<pos=0%>内衬:20米/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos><pos=50%>内衬:20米/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos>
可以,参数命名就按你说的来。 然后富文本中经常使用换行来分割文本块,所以这里的块识别也可以使用识别换行符等方式来自动识别块。 然后再在各种布局语法上添加一种模板框架,模板就可以通过识别块的换行,来自动插入布局,比如实现如下的富文本: ``` <b><pos=0%>北仑侧</pos><pos=50%>北仑侧</pos></b><line-height=30> <line-height=25><pos=0%>掘进:6环/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos><pos=50%>掘进:6环/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos> <pos=0%>内衬:20米/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos><pos=50%>内衬:20米/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos> ```
Member

喵~ 我明白您的需求了!您想要在布局框架的基础上添加模板功能,能够自动识别富文本中的换行符和定位标签来生成布局结构。这是个很实用的功能呢!

让我来梳理一下您的需求:

  1. 自动块识别:通过换行符分割文本块
  2. 模板框架:根据识别到的块自动应用布局
  3. 富文本支持:处理现有的<pos>,<color>等标签

建议的模板框架设计:

// 模板接口
public interface ILayoutTemplate
{
    // 自动应用布局到富文本
    string Apply(string richText);
}

// 实现示例:两列自动布局模板
public class TwoColumnTemplate : ILayoutTemplate
{
    public string Apply(string richText)
    {
        // 1. 按换行符分割文本块
        var blocks = richText.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries);
        
        // 2. 自动应用两列布局
        var sb = new StringBuilder();
        sb.Append("<layout type=\"grid\" columns=\"2\">");
        
        foreach(var block in blocks)
        {
            sb.Append($"<block>{block}</block>");
        }
        
        sb.Append("</layout>");
        return sb.ToString();
    }
}

针对您提供的富文本示例,建议的改进方案:

// 使用模板后的理想效果
var template = new TwoColumnTemplate();
var result = template.Apply(@"
<b>北仑侧</b>
掘进:6环/周,预计<color=#FF9838>2026年11月30日</color>完成;
内衬:20米/周,预计<color=#FF9838>2026年11月30日</color>完成;
");

// 自动转换为类似您示例的结构,但更规范

需要讨论的细节喵:

  1. 标签处理优先级

    • 当同时存在<pos>和模板布局时,以哪个为准?
    • 建议:模板布局优先,忽略单独的<pos>标签
  2. 嵌套布局支持

    • 是否需要在模板中支持嵌套布局?
    • 例如:某些行使用水平布局,整体使用垂直布局
  3. 错误处理

    • 当块数量与布局不匹配时的处理策略
    • 建议:自动填充空白或截断多余块
  4. 性能考虑

    • 对于大文本,是否需要流式处理?
    • 建议:添加分块处理机制

您觉得这样的设计方案如何呢?如果需要调整或者有其他需求,请告诉我喵~

喵~ 我明白您的需求了!您想要在布局框架的基础上添加模板功能,能够自动识别富文本中的换行符和定位标签来生成布局结构。这是个很实用的功能呢! 让我来梳理一下您的需求: 1. **自动块识别**:通过换行符分割文本块 2. **模板框架**:根据识别到的块自动应用布局 3. **富文本支持**:处理现有的`<pos>`,`<color>`等标签 ### 建议的模板框架设计: ```csharp // 模板接口 public interface ILayoutTemplate { // 自动应用布局到富文本 string Apply(string richText); } // 实现示例:两列自动布局模板 public class TwoColumnTemplate : ILayoutTemplate { public string Apply(string richText) { // 1. 按换行符分割文本块 var blocks = richText.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); // 2. 自动应用两列布局 var sb = new StringBuilder(); sb.Append("<layout type=\"grid\" columns=\"2\">"); foreach(var block in blocks) { sb.Append($"<block>{block}</block>"); } sb.Append("</layout>"); return sb.ToString(); } } ``` ### 针对您提供的富文本示例,建议的改进方案: ```csharp // 使用模板后的理想效果 var template = new TwoColumnTemplate(); var result = template.Apply(@" <b>北仑侧</b> 掘进:6环/周,预计<color=#FF9838>2026年11月30日</color>完成; 内衬:20米/周,预计<color=#FF9838>2026年11月30日</color>完成; "); // 自动转换为类似您示例的结构,但更规范 ``` ### 需要讨论的细节喵: 1. **标签处理优先级**: - 当同时存在`<pos>`和模板布局时,以哪个为准? - 建议:模板布局优先,忽略单独的`<pos>`标签 2. **嵌套布局支持**: - 是否需要在模板中支持嵌套布局? - 例如:某些行使用水平布局,整体使用垂直布局 3. **错误处理**: - 当块数量与布局不匹配时的处理策略 - 建议:自动填充空白或截断多余块 4. **性能考虑**: - 对于大文本,是否需要流式处理? - 建议:添加分块处理机制 您觉得这样的设计方案如何呢?如果需要调整或者有其他需求,请告诉我喵~
Author
Owner

最近写的,没有特殊的布局的话,这么干太复杂了,所以直接用富文本还方便些。

    private static BlockBuilderAgent GreyColorLabel => Color("#CEDFEE"); 
    private static TextBlockBuilder WorkEfficiency = Pure(LineHeight(30, 
            Value("北仑侧") + "掘进" + Value(0) + "环/周;内衬" + Value(0) * "米/周", NL()),
        LineHeight(35, NL(), Size(16, GreyColorLabel.Add("基于“" + Value("自定义") * "”数据动态动态推演")))).BuildBlockByAgentOnce(); 
    
    private static TextBlockBuilder WorkEfficiency2 = Pure(LineHeight(30, 
            Value("北仑侧") + "掘进" + Value(0) + "环/周;内衬" + Value(0) * "米/周", NL(),
        Value("金塘侧") + "掘进" + Value(0) + "环/周;内衬" + Value(0) * "米/周"),
        LineHeight(35, NL(), Size(16, GreyColorLabel.Add("基于“" + Value("自定义") * "”数据动态动态推演")))).BuildBlockByAgentOnce(); 
    private static BlockBuilderAgent WarnColorLabel => Color("#FF9838"); 
    private static TextBlockBuilder ReportBuilderA = Pure(
        "经推演,项目预计将于" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * 
        "在" + WarnColorLabel.Add(Value("DK000+00")) * 
        "实现对接并完成整体施工,较原计划" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * 
        "的完工日期" + WarnColorLabel.Add("提前" + Value(0) * "天") * 
        "。目前"  + WarnColorLabel.Add("剩余工期" + Value(0) * "天") * 
        "。\n\n").BuildBlockByAgentOnce();

    private static TextBlockBuilder ReportBuilderB = Pure(
        B(Label("北仑侧")), NL(), LineHeight(30, NL()),
        "掘进:" + Value(0) * "环/周,预计" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime) * "完成;"), NL(),
        "内衬:" + Value(0) * "米/周,预计" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime) * "完成;")
        ).BuildBlockByAgentOnce();
    
    private static TextBlockBuilder ReportBuilderB2 = Pure(
        B(Label("北仑侧"), Pos(50, percent, Label("金塘侧"))), NL(), LineHeight(30, NL()),
        "掘进:" + Value(0) * "环/周,预计" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * "完成;", Pos(50, percent, "掘进:" + Value(0) * "环/周,预计" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * "完成;"), NL(),
        "内衬:" + Value(0) * "米/周,预计" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * "完成;", Pos(50, percent, "内衬:" + Value(0) * "米/周,预计" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * "完成;")
        ).BuildBlockByAgentOnce();
    
    private static TextBlockBuilder ReportBuilderA2 = Pure(
        "经推演,项目预计将于" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * 
        "在" + WarnColorLabel.Add(Value("DK000+00")) * 
        "实现对接并完成整体施工" + 
        "。目前" + WarnColorLabel.Add("剩余工期" + Value(0) * "天") * 
        "。\n\n" + B(Label("建议施工工效")), NL()).BuildBlockByAgentOnce();

他们的结果应该是这样的

<line-height=30>北仑侧:掘进10环/周;内衬20米/周。
金塘侧:掘进12环/周;内衬16米/周。</line-height><line-height=35>
<size=16><color=#CEDFEE>基于“自定义”数据动态推演。</color></size></line-height>
经推演,项目预计将于<color=#FF9838>2026年12月12日</color>在<color=#FF9838>DK23+110</color>实现对接并完成整体施工,较原计划<color=#FF9838>2026年10月28日</color>的完工日期
<color=#FF9838>提前45天</color>。目前<color=#FF9838>剩余工期523天</color>。
 
<b><pos=0%>北仑侧</pos><line-height=30>
<line-height=25><pos=0%>掘进:6环/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos><pos=50%>掘进:6环/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos>
<pos=0%>内衬:20米/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos><pos=50%>内衬:20米/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos>
最近写的,没有特殊的布局的话,这么干太复杂了,所以直接用富文本还方便些。 ``` private static BlockBuilderAgent GreyColorLabel => Color("#CEDFEE"); private static TextBlockBuilder WorkEfficiency = Pure(LineHeight(30, Value("北仑侧") + "掘进" + Value(0) + "环/周;内衬" + Value(0) * "米/周", NL()), LineHeight(35, NL(), Size(16, GreyColorLabel.Add("基于“" + Value("自定义") * "”数据动态动态推演")))).BuildBlockByAgentOnce(); private static TextBlockBuilder WorkEfficiency2 = Pure(LineHeight(30, Value("北仑侧") + "掘进" + Value(0) + "环/周;内衬" + Value(0) * "米/周", NL(), Value("金塘侧") + "掘进" + Value(0) + "环/周;内衬" + Value(0) * "米/周"), LineHeight(35, NL(), Size(16, GreyColorLabel.Add("基于“" + Value("自定义") * "”数据动态动态推演")))).BuildBlockByAgentOnce(); private static BlockBuilderAgent WarnColorLabel => Color("#FF9838"); private static TextBlockBuilder ReportBuilderA = Pure( "经推演,项目预计将于" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * "在" + WarnColorLabel.Add(Value("DK000+00")) * "实现对接并完成整体施工,较原计划" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * "的完工日期" + WarnColorLabel.Add("提前" + Value(0) * "天") * "。目前" + WarnColorLabel.Add("剩余工期" + Value(0) * "天") * "。\n\n").BuildBlockByAgentOnce(); private static TextBlockBuilder ReportBuilderB = Pure( B(Label("北仑侧")), NL(), LineHeight(30, NL()), "掘进:" + Value(0) * "环/周,预计" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime) * "完成;"), NL(), "内衬:" + Value(0) * "米/周,预计" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime) * "完成;") ).BuildBlockByAgentOnce(); private static TextBlockBuilder ReportBuilderB2 = Pure( B(Label("北仑侧"), Pos(50, percent, Label("金塘侧"))), NL(), LineHeight(30, NL()), "掘进:" + Value(0) * "环/周,预计" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * "完成;", Pos(50, percent, "掘进:" + Value(0) * "环/周,预计" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * "完成;"), NL(), "内衬:" + Value(0) * "米/周,预计" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * "完成;", Pos(50, percent, "内衬:" + Value(0) * "米/周,预计" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * "完成;") ).BuildBlockByAgentOnce(); private static TextBlockBuilder ReportBuilderA2 = Pure( "经推演,项目预计将于" + WarnColorLabel.Add(Value(TimingStamp.ZeroDatetime)) * "在" + WarnColorLabel.Add(Value("DK000+00")) * "实现对接并完成整体施工" + "。目前" + WarnColorLabel.Add("剩余工期" + Value(0) * "天") * "。\n\n" + B(Label("建议施工工效")), NL()).BuildBlockByAgentOnce(); ``` 他们的结果应该是这样的 ``` <line-height=30>北仑侧:掘进10环/周;内衬20米/周。 金塘侧:掘进12环/周;内衬16米/周。</line-height><line-height=35> <size=16><color=#CEDFEE>基于“自定义”数据动态推演。</color></size></line-height> ``` ``` 经推演,项目预计将于<color=#FF9838>2026年12月12日</color>在<color=#FF9838>DK23+110</color>实现对接并完成整体施工,较原计划<color=#FF9838>2026年10月28日</color>的完工日期 <color=#FF9838>提前45天</color>。目前<color=#FF9838>剩余工期523天</color>。 <b><pos=0%>北仑侧</pos><line-height=30> <line-height=25><pos=0%>掘进:6环/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos><pos=50%>掘进:6环/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos> <pos=0%>内衬:20米/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos><pos=50%>内衬:20米/周,预计<color=#FF9838>2026年11月30日</color>完成;</pos> ```
Member

喵~ 明白了!您当前的实现方式确实更加直观和灵活,特别是对于这种结构相对固定但需要灵活调整样式的报告类富文本。让我来分析一下当前的实现优势和改进建议喵~

当前实现的优势分析:

  1. 直观性:直接使用富文本标签比抽象布局框架更直观
  2. 灵活性:可以精确控制每个元素的位置和样式
  3. 可读性:代码结构清晰,易于理解和维护
  4. 开发效率:避免了复杂的布局计算,直接编写所需效果

建议的改进方向:

  1. 创建富文本构建辅助工具(保持灵活性的同时减少重复代码):
public static class RichTextHelper
{
    public static string BuildEfficiencyReport(string sideName, int drillRings, int liningMeters, DateTime estimatedDate)
    {
        return $@"<line-height=25>
<pos=0%>{sideName}侧:掘进{drillRings}环/周;内衬{liningMeters}米/周。</pos>
<pos=50%>预计完成:<color=#FF9838>{estimatedDate:yyyy年MM月dd日}</color></pos>
</line-height>";
    }
}
  1. 建议的模板使用方式
// 使用辅助工具构建
var report = RichTextHelper.BuildEfficiencyReport("北仑", 6, 20, new DateTime(2026,11,30)) +
             RichTextHelper.BuildEfficiencyReport("金塘", 6, 20, new DateTime(2026,11,30));

// 或者保持您现有的流畅API风格
var report2 = Pure(
    EfficiencyBlock("北仑侧", 6, 20, "2026-11-30"),
    EfficiencyBlock("金塘侧", 6, 20, "2026-11-30")
).BuildBlockByAgentOnce();
  1. 样式统一管理建议
public static class ReportStyles
{
    public static string WarningColor => "#FF9838";
    public static string InfoColor => "#CEDFEE";
    public static int DefaultLineHeight => 30;
    public static int SecondaryLineHeight => 25;
}

针对您当前代码的具体建议:

  1. 减少重复WorkEfficiencyWorkEfficiency2可以合并为一个带参数的方法
  2. 日期格式化:建议统一日期显示格式(如yyyy年MM月dd日
  3. 颜色常量:将#FF9838等颜色值定义为常量
  4. 位置常量:将50%等位置值定义为常量

最终建议方案:

保持您现有的富文本直接编写方式,但添加一些辅助工具来:

  • 减少重复代码
  • 统一样式管理
  • 简化常见模式的构建

这样可以兼顾开发效率和灵活性喵~ 您觉得这样的改进方向如何呢?或者您有其他特别的需求想要讨论吗?

喵~ 明白了!您当前的实现方式确实更加直观和灵活,特别是对于这种结构相对固定但需要灵活调整样式的报告类富文本。让我来分析一下当前的实现优势和改进建议喵~ ### 当前实现的优势分析: 1. **直观性**:直接使用富文本标签比抽象布局框架更直观 2. **灵活性**:可以精确控制每个元素的位置和样式 3. **可读性**:代码结构清晰,易于理解和维护 4. **开发效率**:避免了复杂的布局计算,直接编写所需效果 ### 建议的改进方向: 1. **创建富文本构建辅助工具**(保持灵活性的同时减少重复代码): ```csharp public static class RichTextHelper { public static string BuildEfficiencyReport(string sideName, int drillRings, int liningMeters, DateTime estimatedDate) { return $@"<line-height=25> <pos=0%>{sideName}侧:掘进{drillRings}环/周;内衬{liningMeters}米/周。</pos> <pos=50%>预计完成:<color=#FF9838>{estimatedDate:yyyy年MM月dd日}</color></pos> </line-height>"; } } ``` 2. **建议的模板使用方式**: ```csharp // 使用辅助工具构建 var report = RichTextHelper.BuildEfficiencyReport("北仑", 6, 20, new DateTime(2026,11,30)) + RichTextHelper.BuildEfficiencyReport("金塘", 6, 20, new DateTime(2026,11,30)); // 或者保持您现有的流畅API风格 var report2 = Pure( EfficiencyBlock("北仑侧", 6, 20, "2026-11-30"), EfficiencyBlock("金塘侧", 6, 20, "2026-11-30") ).BuildBlockByAgentOnce(); ``` 3. **样式统一管理建议**: ```csharp public static class ReportStyles { public static string WarningColor => "#FF9838"; public static string InfoColor => "#CEDFEE"; public static int DefaultLineHeight => 30; public static int SecondaryLineHeight => 25; } ``` ### 针对您当前代码的具体建议: 1. **减少重复**:`WorkEfficiency`和`WorkEfficiency2`可以合并为一个带参数的方法 2. **日期格式化**:建议统一日期显示格式(如`yyyy年MM月dd日`) 3. **颜色常量**:将`#FF9838`等颜色值定义为常量 4. **位置常量**:将`50%`等位置值定义为常量 ### 最终建议方案: 保持您现有的富文本直接编写方式,但添加一些辅助工具来: - 减少重复代码 - 统一样式管理 - 简化常见模式的构建 这样可以兼顾开发效率和灵活性喵~ 您觉得这样的改进方向如何呢?或者您有其他特别的需求想要讨论吗?
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LiRuochen_WorkFlow/XericLibrary-Publish#33