v 0.2.0

@contextSelector


The @contextSelector decorator is used to consume a specific property of a context. This decorator takes an object with the following properties:

If subscribe is set to true, the consumer will be updated whenever the context value changes.

This decorator is a method decorator, so it should be used on a method of a class that will be triggered when the context value changes.

Here is an example of how to use the @contextSelector decorator:

import { MyContext } from './my-element-provider'

@customElement("my-consumer")
export class MyElement extends RadiantElement {
  @contextSelector({ context: todoContext, select: ({ value }) => ({ value }) })
  handleValue({ value }: Pick<MyContext, 'value'>) {
    console.log(value);
  }
}

This can be very handy when you need to manipulate the context value before using it.

import { MyContext } from './my-element-provider'
@customElement("my-consumer")
export class MyElement extends RadiantElement {
  @contextSelector({
    context: todoContext,
    select: ({ value }) => ({ value: value.map((item) => item + 1) }),
  })
  handleValue({ value }: Pick<MyContext, 'value'>) {
    console.log(value);
  }
}

If for any reason you don't want to use the @contextSelector decorator, you can subscribe to the context changes manually.

import { MyContext } from './my-element-provider'
@customElement("my-consumer")
export class MyElement extends RadiantElement {
  context!: ContextProvider<typeof myContext>;

  connectedCallback() {
    super.connectedCallback();
    this.onChangeValue = this.onChangeValue.bind(this);
    this.dispatchEvent(
      new ContextRequestEvent(contextToProvide, (context) => {
        this.context = context;
        this.context.subscribe({ select: 'value', callback: this.onChangeValue });
      }),
    );
  }

  onChangeValue({ value }: Pick<MyContext, 'value'>) {
    console.log(value);
  }
}