如何安全地保存不受渲染影响的变量?

How do I securely save a variable not affected by render?

我正在尝试将用户集合中的一个变量保存到客户端以便我可以使用它,但我不希望客户端能够更改该变量。我该如何实现?

目前我有这个,但它一直在打开和关闭,因为它在渲染时并不总是从集合中获取变量:

function AdminMenu() {
    const user = useTracker(() => Meteor.user());
    
    if (user.admin) {
        return (
            <div>isAdmin</div>
        );
    } else {
        return (<div/>);
    }
}

我可以让它按照我想要的方式工作,但恐怕客户端可以编辑变量:

let isAdmin = false;

function AdminMenu() {
    const user = useTracker(() => Meteor.user());
    
    if (user.admin) {
        isAdmin = true;
    }
    
    if (isAdmin) {
        return (
            <div>isAdmin</div>
        );
    } else {
        return (<div/>);
    }
}

实现此目标的最佳方法是什么? 提前致谢!

更改的原因是组件首次呈现时订阅尚未准备就绪,但一旦准备就绪,跟踪器将导致模板重新呈现并显示新状态。要解决此问题,您需要在使用跟踪器挂钩中进行订阅,并且仅在订阅准备就绪后才呈现。试试这个。

function AdminMenu() {
  const { user, ready } = useTracker(() => ({
    user: Meteor.user(),
    ready: Meteor.subscribe('your-subscription-name').ready();
  }));
  
  if (ready && user.admin) {
      return (
          <div>isAdmin</div>
      );
  } else {
      return (<div/>);
  }
}

还有另一种处理这个问题的方法有点复杂,所以我不会在这里详细说明,但请参阅我上面的评论并加入 Meteor Community Slack,我非常乐意为您提供帮助如果您愿意,可以进一步了解。