mirror of
https://github.com/MercuryWorkshop/dreamlandjs.git
synced 2025-11-09 12:05:18 -05:00
No results
1
7. Arrays
~coolelectronics edited this page 2024-03-10 13:53:37 -04:00
Arrays
You can pass an array of HTML elements (or strings) inside an element and it will render them correctly
let items = [<div>1</div>, <div>2</div>]
let elm = <div>{items}</div>
You can also do it with dynamic list references:
this.items = [<div>1</div>, <div>2</div>]
let elm = <div>{use(this.items)}</div>
this.items = [<div>a different</div>, <div>list</div>]
For mutating arrays, if you run push on an array it will not update automatically. You can either do
this.items.push(<div>another item</div>)
this.items = this.items
or use es6 spread syntax
this.items = [...this.items, <div>another item</div>]
Using this.items to store the html elements from ToDoItem, we can easily create a todo app with dynamic add/remove elements.
const ToDoItem: Component<{
// required properties
title: string
remove: () => void
},{}> = function() {
return (
<div>
// we don't need to use `use` here because `title` doesn't change over the lifetime of this component. If title is needed to react to changes, `use` can be added
{this.title}
<button on:click={()=>this.remove()}>Remove Item</button>
</div>
)
}
const ToDoList: Component<{
// items can also be an HTMLElement[]
items: ComponentElement<typeof ToDoItem>[],
text: string
},{}> = function() {
this.items = [];
return (
<div>
<input bind:value={use(this.text)} />
<button on:click={()=>{
let newitem = <ToDoItem title={this.text} remove={()=> this.items = this.items.filter(i=>i!=newitem)}/>
this.items = [...this.items, newitem]
}}/>
<div>
{use(this.items)}
</div>
</div>
)
}
Notice how this.items = [...this.items, newitem] added the new todo element and this.items = this.items.filter(...) removed the specific element when the button was pressed
array.map
Often times you'll have an array that represents data and not the html elements directly. Using the array map, you can construct an html element based on the array data
this.items = [{ text: "a string" }, { text: "another string" }];
<div>{use(this.items, items => items.map((item) => <span>{item.text}</span> ))}</div>