как мне сделать детализированные сигналы, которые работают для свойств всего чистого класса
У меня есть класс, который хранит входные события и позволяет мне запрашивать состояние.
class Input {
btn() { return this._btn }
_release() { this._btn = -1 }
_press() { this._btn = 0 }
listen() {
document.addEventListener('keydown', e => this._press())
document.addEventListener('keyup', e => this._release())
}
update() {
if (this._btn >= 0) this._btn++
}
}
Я использую этот класс следующим образом:
let input = new Input()
input.listen()
function update_every_frame() {
input.update()
}
function check_for_input() {
if (input.btn() > 0) {
console.log('here')
}
}
Поэтому, используя кодирование в твердом стиле, я хочу сделать сигнал, который изменяется всякий раз, когда нажимается кнопка ввода:
let [input, setInput] = createSignal(new Input(), { equals: false })
function update_every_frame() {
setInput(input => { input.update(); return input })
}
const check_for_input = () => { return input().btn() }
В настоящее время
Мне не нужны детализированные сигналы на уровне данных, где я загрязняю чистый класс данных сигналами. Потому что я хочу создать класс данных и протестировать его независимо от библиотеки.
Итак, как мне сделать детализированные сигналы, которые работают для свойств всего чистого класса.
Редактировать
Также, например, как мне создать сигналы или заметки для массива или свойство получателя в классе, чтобы сигналы обновлялись соответствующим образом, когда класс обновляет свои свойства:
class Test {
array: Array
a: number = 0
get computed(): {
return this.a < 4 ? 1 : 0
}
update() {
this.a = 10
}
}
let [instance, setInstance] = createSignal(new Test(), { equals: false })
let arraySignal = createMemo(() => instance().array)
let computedSignal = createMemo(() =>
instance.computed)
Как вычисляемый сигнал обновляется при вызове этого метода:
setInstance(instance => instance.update())
1 ответ
Один из способов сделать это так:
import {createMutable} from 'solid-js/store'
import {createEffect} from 'solid-js'
class Foo {
// any properties here
whatever = 123
constructor() {
return createMutable(this)
}
}
const f = new Foo
createEffect(() => console.log(f.whatever))
f.whatever++ // reactive
или сохранить класс действительно чистым:
import {createMutable} from 'solid-js/store'
import {createEffect} from 'solid-js'
class Foo {
// any properties here
whatever = 123
}
const f = createMutable(new Foo)
createEffect(() => console.log(f.whatever))
f.whatever++ // reactive
Вы сказали, что не хотите делать сигнал для каждого свойства, но сclassy-solid
вы можете сделать это так, как будто вы пишете обычный класс:
import {reactive, signal} from 'classy-solid'
@reactive
class Foo {
@signal whatever = 123
}
const f = new Foo
createEffect(() => console.log(f.whatever))
f.whatever++ // reactive