import React,{
useEffect, useState }from"react";import{
proxy, useSnapshot, subscribe }from"valtio";import{
subscribeKey, watch, derive }from"valtio/utils";// create a base proxyconst state =proxy({
count:1,});// create a derived proxyconst derived =derive({
doubled:(get)=>get(state).count *2,});// alternatively, attach derived properties to an existing proxyconst three =derive({
tripled:(get)=>get(state).count *3,},{
proxy: state,});setInterval(()=>{
++state.count;},1000);exportdefaultfunctionApp(){
const snap =useSnapshot(state);return(<div className="App" style={
{
height:500,padding:20}}>{
derived.doubled}============{
three.tripled}=============={
three.count}{
snap.count}</div>);}
proxyWithComputed
类似于computed,与上面相比多了缓存。
作者建议尽量不要使用,因为和usesnapshot做了相同的事,而且有可能会导致内存泄漏
import memoize from'proxy-memoize'import{
proxyWithComputed }from'valtio/utils'const state =proxyWithComputed({
count:1,},{
doubled:memoize((snap)=> snap.count *2),})// Computed values accept custom setters too:const state2 =proxyWithComputed({
firstName:'Alec',lastName:'Baldwin',},{
fullName:{
get:memoize((snap)=> snap.firstName +' '+ snap.lastName),set:(state, newValue)=>{
;[state.firstName, state.lastName]= newValue.split(' ')},},})// if you want a computed value to derive from another computed, you must declare the dependency first:const state =proxyWithComputed({
count:1,},{
doubled:memoize((snap)=> snap.count *2),quadrupled:memoize((snap)=> snap.doubled *2),})
import{
proxySet }from'valtio/utils'const state =proxySet([1,2,3])//can be used inside a proxy as well//const state = proxy({
// count: 1,// set: proxySet()//})
state.add(4)
state.delete(1)
state.forEach((v)=> console.log(v))// 2,3,4
import{
proxyMap }from'valtio/utils'const state =proxyMap([['key','value'],['key2','value2'],])
state.set('key','value')
state.delete('key')
state.get('key')// ---> value
state.forEach((value, key)=> console.log(key, value))// ---> "key", "value", "key2", "value2"