μƒνƒœ ν•„λ“œ(State field)λŠ” μ‚¬μš©μž μ •μ˜ 에디터 μƒνƒœλ₯Ό 관리할 수 μžˆλŠ” 에디터 ν™•μž₯ κΈ°λŠ₯μž…λ‹ˆλ‹€. 이 νŽ˜μ΄μ§€λŠ” 계산기 ν™•μž₯ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λ©΄μ„œ μƒνƒœ ν•„λ“œλ₯Ό κ΅¬μΆ•ν•˜λŠ” 과정을 μ•ˆλ‚΄ν•©λ‹ˆλ‹€.

κ³„μ‚°κΈ°λŠ” ν˜„μž¬ μƒνƒœμ— 숫자λ₯Ό λ”ν•˜κ±°λ‚˜ λΉΌκ³ , λ‹€μ‹œ μ‹œμž‘ν•˜λ €λ©΄ μƒνƒœλ₯Ό μ΄ˆκΈ°ν™”ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€λ₯Ό 마치면 μƒνƒœ ν•„λ“œλ₯Ό κ΅¬μΆ•ν•˜λŠ” κΈ°λ³Έ κ°œλ…μ„ μ΄ν•΄ν•˜κ²Œ 될 κ²ƒμž…λ‹ˆλ‹€.

Note

이 νŽ˜μ΄μ§€λŠ” Obsidian ν”ŒλŸ¬κ·ΈμΈ 개발자λ₯Ό μœ„ν•΄ 곡식 CodeMirror 6 λ¬Έμ„œλ₯Ό μš”μ•½ν•œ κ²ƒμž…λ‹ˆλ‹€. μƒνƒœ ν•„λ“œμ— λŒ€ν•œ 더 μžμ„Έν•œ μ •λ³΄λŠ” State Fieldsλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

ν•„μˆ˜ 쑰건

μƒνƒœ 효과 μ •μ˜

μƒνƒœ 효과(State effect)λŠ” μˆ˜ν–‰ν•˜λ €λŠ” μƒνƒœ 변경을 μ„€λͺ…ν•©λ‹ˆλ‹€. 클래슀의 λ©”μ„œλ“œλΌκ³  생각할 수 μžˆμŠ΅λ‹ˆλ‹€.

계산기 μ˜ˆμ œμ—μ„œλŠ” 각 계산기 연산에 λŒ€ν•œ μƒνƒœ 효과λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€:

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)],
});

더 μΉœμˆ™ν•œ APIλ₯Ό μ œκ³΅ν•˜λŠ” λ„μš°λ―Έ ν•¨μˆ˜ μ„ΈνŠΈλ₯Ό μ •μ˜ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€:

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)],
  });
}

λ‹€μŒ 단계

μƒνƒœ ν•„λ“œμ—μ„œ Decorationsλ₯Ό μ œκ³΅ν•˜μ—¬ λ¬Έμ„œ ν‘œμ‹œ 방식을 λ³€κ²½ν•˜μ„Έμš”.