管理额外的状态
使用范围
客户端 useHook
在之前的跨页面/模块更新响应状态章节中,介绍了如何通过updateState跨页面或模块更新响应状态,但它只能更新由 useHooks 创建的状态,如果需要跨组件更新自定义的状态,应该怎么做呢?让我们继续吧!
更新单个状态
可以在 useHooks 调用时通过managedStates管理额外的状态,并在其他模块/页面中调用updateState时,自动指定状态名称来更新它。
- vue
- react
- svelte
- solid
- PageA.vue
- PageB.vue
const todoList = () => alova.Get('/todo');
const allTodo = ref([]);
useRequest(todoList, {
// ...
// 将allTodo作为额外的状态进行管理
managedStates: {
allTodo
}
});
const handleSuccess = () => {
// 传入一个对象并指定状态名来查找
updateState(alova.Get('/todo'), {
allTodo: allTodoData => {
// 新增一条todo项
allTodoData.push({
title: 'new todo',
time: '10:00'
});
return allTodoData;
}
});
};
- PageA.jsx
- PageB.jsx
const PageA = () => {
const todoList = () => alova.Get('/todo');
const allTodoState = useState([]);
const [allTodo, setAllTodo] = allTodoState;
useRequest(todoList, {
// ...
// 将allTodo作为额外的状态进行管理
managedStates: {
allTodo: allTodoState
}
});
return (
// ...
);
}
const PageB = () => {
// ...
const handleSuccess = () => {
// 传入一个对象并指定状态名来查找
updateState(alova.Get('/todo'), {
allTodo: allTodoData => {
// 新增一条todo项
allTodoData.push({
title: 'new todo',
time: '10:00'
});
return allTodoData;
}
});
};
return (
// ...
);
}
- PageA.svelte
- PageB.svelte
// a.svelte
const todoList = () => alova.Get('/todo');
const allTodo = writable([]);
useRequest(todoList, {
// ...
// 将allTodo作为额外的状态进行管理
managedStates: {
allTodo
}
});
const handleSuccess = () => {
// 传入一个对象并指定状态名来查找
updateState(alova.Get('/todo'), {
allTodo: allTodoData => {
// 新增一条todo项
allTodoData.push({
title: 'new todo',
time: '10:00'
});
return allTodoData;
}
});
};
- PageA.jsx
- PageB.jsx
const PageA = () => {
const todoList = () => alova.Get('/todo');
const allTodoState = createSignal([]);
const [allTodo, setAllTodo] = allTodoState;
useRequest(todoList, {
// ...
// 将allTodo作为额外的状态进行管理
managedStates: {
allTodo: allTodoState
}
});
return (
// ...
);
}
const PageB = () => {
// ...
const handleSuccess = () => {
// 传入一个对象并指定状态名来查找
updateState(alova.Get('/todo'), {
allTodo: allTodoData => {
// 新增一条todo项
allTodoData.push({
title: 'new todo',
time: '10:00'
});
return allTodoData;
}
});
};
return (
// ...
);
}