Common Code
export interface SomeValue { name: string; value: string; }
Passing an Object
import { Component, h, Prop, Watch } from '@stencil/core'; import { SomeValue } from './some-value.interface'; @Component({ tag: 'object-sample', styleUrl: '...', shadow: true }) export class ObjectSample { private _objectData: SomeValue; @Prop() objectData: SomeValue | string; @Watch('objectData') objectDataWatcher(newValue: SomeValue | string) { if (typeof newValue === 'string') { this._objectData = JSON.parse(newValue); } else { this._objectData = newValue; } } componentWillLoad() { this.objectDataWatcher(this.objectData); } render() { return ( <div class='object-data'> <span>{this._objectData.name}</span> <span>{this._objectData.value}</span> </div> ); } }
<object-sample object-data='{"name": "Bird", "value": "Chirp"}'> </object-sample>
Passing an Array
import { Component, h, Prop, Watch } from '@stencil/core'; import { SomeValue } from './some-value.interface'; @Component({ tag: 'array-sample', styleUrl: '...', shadow: true }) export class ArraySample { private _arrayData: SomeValue[]; @Prop() arrayData: SomeValue[] | string; @Watch('arrayData') arrayDataWatcher(newValue: SomeValue[] | string) { if (typeof newValue === 'string') { this._arrayData = JSON.parse(newValue); } else { this._arrayData = newValue; } } componentWillLoad() { this.arrayDataWatcher(this.arrayData); } render() { return [ <div class='array-size'>{ this._arrayData.length }</div>, this._arrayData.map(x => <div class='row'> <span>{x.name}</span> <span>{x.value}</span> </div> ) ]; } }
<array-sample array-data='[{"name": "Cat", "value": "Meow"}, {"name": "Dog", "value": "Woof"}]'> </array-sample>
Key Concepts
- The
@Prop()
datatype must contain string if a type is defined - Use a
@Watch()
function to parse the json string value - Call the
@Watch()
function in thecomponentWillLoad()
function for the first parse of the json data- The
@Watch()
function does not fire on the first load of the component
- The
- The value passed to the
@Prop()
must follow strict json syntax
Version Consideration
These examples are Stencil One. If you are using pre @stencil/core@one Check out the Breaking changes document to see what updates are needed to get this sample to work for you in the beta
Top comments (0)