目 录CONTENT

文章目录

1.3.5.[Obsidian][插件][编辑器]状态字段

克林空间
2024-01-30 / 0 评论 / 0 点赞 / 22 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2024-01-30,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

状态字段是一种[[编辑器扩展]],可用于管理自定义编辑器状态。本页将引导你通过实现计算器扩展来构建状态字段。

计算器应能从当前状态中加减一个数字,并在您想重新开始时重置状态。

在本节结束时,您将了解构建状态字段的基本概念。

[!NOTE]

本页旨在为Obsidian 插件开发人员提炼 CodeMirror 6 官方文档。有关状态字段的详细信息,请参阅State Fields

先决条件

  • 对[[状态管理]]有基本了解。

定义状态效果

状态效果描述的是你想要进行的状态改变。您可以将它们视为类的方法。

在计算器示例中,您将为计算器的每个操作定义一个状态效果:

const addEffect = StateEffect.define<number>();
const subtractEffect = StateEffect.define<number>();
const resetEffect = StateEffect.define();

角括号 <> 内的类型定义了效果的输入类型。例如,要加减的数字。重置效果不需要任何输入,因此可以省略。

定义状态字段

与人们的想象相反,状态字段实际上并不存储状态。它们管理状态。状态字段接收当前状态,应用任何状态效果,并返回新状态。

状态字段包含计算器逻辑,用于根据事务中的效果应用数学运算。由于一个事务可能包含多个运算结果,例如两个加法运算结果,因此状态字段需要一个接一个地应用所有运算结果。

export const calculatorField = StateField.define<number>({
  create(state: EditorState): number {
    return 0;
  },
  update(oldState: number, transaction: Transaction): number {
    let newState = oldState;

    for (let effect of transaction.effects) {
      if (effect.is(addEffect)) {
        newState += effect.value;
      } else if (effect.is(subtractEffect)) {
        newState -= effect.value;
      } else if (effect.is(resetEffect)) {
        newState = 0;
      }
    }

    return newState;
  },
});
  • create 返回计算器的起始值。
  • update 包含应用效果的逻辑。
  • effect.is() 可让您在应用特效前检查其类型。

发送状态效果

要对状态字段应用状态效果,需要将其作为事务的一部分发送到编辑器视图。

view.dispatch({
  effects: [addEffect.of(num)],
});

您甚至可以定义一组辅助函数,提供更易懂的应用程序接口:

export function add(view: EditorView, num: number) {
  view.dispatch({
    effects: [addEffect.of(num)],
  });
}

export function subtract(view: EditorView, num: number) {
  view.dispatch({
    effects: [subtractEffect.of(num)],
  });
}

export function reset(view: EditorView) {
  view.dispatch({
    effects: [resetEffect.of(null)],
  });
}

下一步

Provide Decorations from your state fields to change how to display the document.
在您状态字段中提供装饰,以更改文档的显示方式。

0

评论区