使用Reaction Native,这款应用程序需要:

  1. 移动对象
  2. 然后在屏幕上更新文本(一个数字)
  3. 然后移动另一个物体
  4. 然后更新屏幕上的相同文本(另一个数字)

Problem: #4 does not update on the screen.

GIT link显示当前代码.

谷歌解释了这个问题:"React中的useState钩子在Promise Chain中不会更新两次.这是因为Reaction批处理状态更新,这意味着在一个事件循环周期内发生的所有状态更新被组合在一起,并在周期结束时apply.这有助于通过避免不必要的重新呈现来提高性能."

因此,也许这个按钮应该一个接一个地调用两个Promises,每个Promises都链接到useState更新.第二个promise动画可以具有与第一个动画相同的持续时间的延迟,以使它们连续.我还没有插上电源试一下,很快就可以了.

动画功能看起来像这样:

  function updateNumCatsMoved(){
    let newNumCats = { ... numCatsMoved };
    newNumCats.value = newNumCats.value + 1;
    setNumCatsMoved(newNumCats);
    console.log("numCatsMoved:",numCatsMoved.value);
  };

  async function pressablePromise(){
    new Promise(function(myResolve, myReject) {
      cat1X.value = withTiming(cat1XEnd, config);
      cat1Y.value = withTiming(cat1YEnd, config, () => {
        runOnJS(myResolve)(); 
      }); 
    })

    .then(function() {  return updateNumCatsMoved();})

    .then(
      function() { 
        cat2X.value = withTiming(cat2XEnd, config);
        cat2Y.value = withTiming(cat2YEnd, config, () => {
          return; 
        }); 
      }
    )
     // doesn't update on the screen 
    .then(function() {  return updateNumCatsMoved();})  
  }

推荐答案

这是通过向useState函数传递值来实现的.值是要更新的金额.在我的真实应用程序中,更新可以是—1,0或+1.这个问题让我学习了promise以及React如何批处理状态更新.

要处理的一个问题是,两个更新的useState都以0开头.我想我可以使用一个局部变量来帮助它.

所以它进行了两次更新,但每一次都是从0开始.所以它只从0变成了1.

  function updateNumCatsMoved(n){
    let newNumCats = { ... numCatsMoved };
    newNumCats.value = newNumCats.value + n;
    setNumCatsMoved(newNumCats);
  };

  function pressablePromise(){
    new Promise(function(myResolve, myReject) {
      cat1X.value = withTiming(cat1XEnd, config);
      cat1Y.value = withTiming(cat1YEnd, config, () => {
        runOnJS(myResolve)(); 
      }); 
    })

    .then(function() {  return updateNumCatsMoved(1);})

    .then(
      function() {
        return new Promise((resolve, reject)=>{
          cat2X.value = withTiming(cat2XEnd, config);
          cat2Y.value = withTiming(cat2YEnd, config, () => {
            runOnJS(resolve)();
          }); 
        })
      }
    )
     
    .then(function() {  return updateNumCatsMoved(2);})  
  }

Javascript相关问答推荐

如何在NightWatch.js测试中允许浏览器权限?

无法将nPM simplex-noise包导入在JS项目中工作

如何在使用fast-xml-parser构建ML时包括属性值?

Redux查询多个数据库Api reducerPath&

点击按钮一次有文本出现和褪色,而不是点击两次?(html,CSS,JavaScript)

在网页上添加谷歌亵渎词

Websocket错误—有一个或多个保留位开启:reserved1 = 1,reserved2 = 0,reserved3 = 0

使用ThreeJ渲染的形状具有抖动/模糊的边缘

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

是什么导致了这种奇怪的水平间距错误(?)当通过JavaScript将列表项元素追加到无序列表时,是否在按钮之间?

OpenAI转录API错误请求

为什么当我更新数据库时,我的所有组件都重新呈现?

使用Document.Evaluate() Select 一个包含撇号的HTML元素

如何组合Multer上传?

如果NetSuite中为空,则限制筛选

Jexl to LowerCase()和Replace()

MUI迷你图:如何将$符号添加到MUI迷你图中的工具提示数据

当达到高度限制时,如何裁剪图像?使用html和css

如何使用useparams从react路由中提取id

如何让noWrap在嵌套在Alert/AlertTitle组件中的排版组件中工作?