【问题标题】:Sharing varible data between components in React在 React 中的组件之间共享可变数据
【发布时间】:2021-12-06 16:47:58
【问题描述】:

我在 React 和 Node.js 中制作了一个触摸打字游戏,我想让 TypeScript 页面中的函数组件更新一个全局共享的 EXP 变量,以便玩家可以在应用页面中导航并保留他们获得的 XP。一旦他们关闭应用程序,变量就可以重置,它只需要在每个会话中。这是type.tsx里面的XP代码,这是App.js的路由中调用的函数组件

Type.tsx

...

if (currIndex + 1 === length) {
      xpM = xpM + 1;
      bonusCounter = bonusCounter + 1;
      err = err + errorChar;
      currXP = xp * correctChar;
      addXP = (currXP - (err * 2)) * xpM;
      xpPercent = Math.round((uXP/xpNeed) * 100);
      (gain as HTMLAudioElement).play();
      console.log(xpPercent);
      if (err > correctChar) {
        addXP = correctChar * 3;
      }
      tXP = tXP + addXP;
      uXP = tXP;
...

我希望 tXP、xpNeed 和 level 变量可以从 Select Test 组件以及其他打字页面访问(有 6 种不同的测试使用不同的文本数组来填充打字文本。)我已经阅读了 Redux可以做到这一点,但在调查之后似乎我需要重新构建整个应用程序才能使用 Redux 工具。有没有一种快速而肮脏的方法来实现这一目标?该应用程序仅用作正在开发的大型 Unity 游戏的演示,因此它不必是一个超级优雅或复杂的解决方案。谢谢!

【问题讨论】:

  • 本指南可能会有所帮助:Lifting State Up
  • useContext 很好用,非常感谢!我是 React 的新手,所以我还在发现一些小事情。谢谢两位的建议!

标签: javascript node.js reactjs typescript variables


【解决方案1】:

为全局变量及其方法创建一个类:

export default class GlobalVariables {
static createVariables() {
    //set here variables you want to be global
    this.tXP = 0;
}

static getXP() {//method to get XP
    return this.tXP;
}

static addXP(value) {//method to add XP
    this.tXP += value;
}

//create others methods you want for your variables
}

在您的启动组件中导入类并调用 createVariables(在应用启动时调用它):

import GlobalVariables from './Global'
...
GlobalVariables.createVariables()
...

在您的其他组件中导入该类并使用其他方法:

import GlobalVariables from './Global'
...
GlobalVariables.addXP(5);
console.log(GlobalVariables.getXP())
...

【讨论】:

  • 这个解决方案的问题是你必须手动调用getXP 来接收更新——这违背了保持组件和 UI 自动同步的目的。
【解决方案2】:

我建议您使用React Context 在组件之间共享状态。您可以创建一个可以从相关组件访问的 EXP 变量并共享更新。

如果您需要保持服务器同步,您可以在上面的 Context Provider 中更新本地状态时发布 EXP 增量,或者如果您需要实时通信并且游戏非常健谈,则使用 socket.io。

【讨论】:

  • 感谢您的回复! useContext 正是我在这个快速项目中所需要的!我是 React 的新手,所以我仍在探索组件交互的来龙去脉。也很高兴知道 SO 将根据答案因素关闭问题。再次感谢!
猜你喜欢
  • 2020-11-08
  • 2016-10-23
  • 1970-01-01
  • 2019-05-16
  • 2020-08-31
  • 2020-03-14
  • 2019-02-09
相关资源
最近更新 更多