reactjs - Reanimated 2 hooks 中依赖参数的更好用例是什么?
问题描述
我一直在阅读重新激活 2 Hooks 的文档并在所有互联网上搜索更好解释的博客或任何代码,但找不到任何一个,任何人都可以解释并给出源代码示例。作为示例
const App = () => {
const [state, setState] = useState(0);
const sv = useSharedValue(0);
const handler = useAnimatedGestureHandler(
{
onEnd: (_) => {
sv.value = state;
},
},
dependencies
);
//...
return <></>;
};
但是当我尝试
const [test, setTest ] = useState(true);
const gestureHandler = useAnimatedGestureHandler({
onStart : (event,context)=>{
console.log("onstart");
setTest(true);
context.startX = X.value;
},
onActive : (event,context)=>{
console.log("onactive");
X.value = context.startX + event.translationX;
},
onEnd : (event,context)=>{
console.log("onEnd");
setTest(false);
}
},
[test]
)
我得到了错误
Tried to Synchronously call function (bound dispatchAction)
from different thread.
解决方案
您需要使用runOnJS,因为您没有调用工作集,因此请尝试:
const gestureHandler = useAnimatedGestureHandler(
{
onStart: (event, context) => {
console.log('onstart');
runOnJS(setTest)(true);
context.startX = X.value;
},
onActive: (event, context) => {
console.log('onactive');
X.value = context.startX + event.translationX;
},
onEnd: (event, context) => {
console.log('onEnd');
runOnJS(setTest)(false);
},
},
// [test], you don't need dependencies in this case
);
当您想在重新渲染时更新工作集使用的值时,您需要使用依赖项。在您的第一个示例中,您state
在手势结束时分配了一个共享值。为了在重新渲染时使用更新的状态,您需要将其放入挂钩依赖项中,否则工作集将仅捕获并使用第一个值:0
在这种情况下。
推荐阅读
- android - 如果键盘显示,Android SpellChecker 不起作用
- python - 如何笛卡尔乘以描述两个字典的比率?
- java - NewRelic - Java 代理检查是否未使用旧包
- google-maps - 是否有任何 api 可以从 google maps Api 获取 3D 地图?
- android - 选择列表正在单击,但未显示蓝色勾号
- java - 实现普罗米修斯时的竞争条件
- django - 如何在 django 查询中使用列表
- c++ - 模板库中的名称查找:我们为什么要添加这个->
- java - Android gradle:从外部依赖项中排除文件
- cross-browser - 我的应用程序不能在 IE 浏览器上运行,我有 abp-zero-template 6.5.0 和 angular vesrion 7.1.0