列表渲染
当我们有一个场景需要展示一个订单列表,用户可以选择过滤掉某些订单便于快速操作,我们可以通过内联 map 和 filter 来完成这个功能。
import { FC } from 'gyron'
const App = FC(({ orders }) => {
return (
<ul>
{orders
.filter((order) => order.price > 2000)
.map((order) => (
<li>{order.name}</li>
))}
</ul>
)
})
我们通过 filter 先筛选出价格大于 2000 的订单然后通过 map 渲染它们。这是一个比较常见的用法,也可以在 map 中使用条件判断来完成这些事情。
import { FC } from 'gyron'
const App = FC(({ orders }) => {
return (
<ul>
{orders.map((order) => {
if (order.price > 2000) {
return <li style={{ color: 'red' }}>{order.name}</li>
}
return <li>{order.name}</li>
})}
</ul>
)
})
我们可以通过条件判断,让订单金额大于 2000 的文字更醒目。上面代码还可以简化成这样
import { FC } from 'gyron'
const App = FC(({ orders }) => {
return (
<ul>
{orders.map((order) => (
<li style={{ color: order.price > 2000 ? 'red' : 'inherit' }}>
{order.name}
</li>
))}
</ul>
)
})
Key
在循环渲染中如果存在 key 值,那么循环中将会使用 key 作为比对标准,最小化的更新 dom 节点。
import { FC } from 'gyron'
const App = FC(({ orders }) => {
return (
<ul>
{orders.map((order) => (
<li key={order.id}>{order.name}</li>
))}
</ul>
)
})
当 orders 发生变更,我们会根据传递的 id 进行对比,如果发现只是顺序变更,那么 Gyron.js 只会去更新它们在 DOM 树中的顺序,而不是重新去渲染。
memo 参数
在一些循环渲染的例子中可以极大的提高渲染速度和响应速度,在基准测试中使用 memo 可以将更新操作和选中操作提高 5 到 15 倍。如果你只是一般的逻辑渲染完全不需要使用此参数进行优化。
import { FC, useValue } from 'gyron'
const Table = FC(() => {
const rows = useValue([])
return (
<table>
<tbody>
{rows.value.map(({ id, label }) => {
return (
<tr
key={id}
class={id === selected.value ? 'danger' : null}
memo={[id === selected.value, label]}
></tr>
)
})}
</tbody>
</table>
)
})
memo 属性会告诉 Gyron.js 当属性中的值发生变更才继续渲染子节点,否则将跳过子节点的渲染,在循环中尤其有用。更新信息可以参见基准测试结果 https://krausest.github.io/js-framework-benchmark/current.html