reactjs - 如何使用 nextjs 删除此道具类型警告?
问题描述
我在控制台中收到以下警告:
Warning: Prop 'href' did not match. Server: "/register" Client: "/profile"
相关代码片段如下。如果用户已登录,则显示按钮的版本,如果他们已注销,则显示不同的版本。服务器端呈现的版本将始终评估为正在注销的用户。当用户在浏览器中登录时,不匹配会导致此警告。
class Header extends Component {
render() {
return (
<HeaderContainer>
<HeaderButton />
</HeaderContainer>
);
}
}
const HeaderButton = () => {
if (isLoggedIn()) {
return (
<Link href="/profile" as="/profile">
<Button href="/profile">Profile</Button>
</Link>
);
}
return (
<Link href="/register" as="/register">
<Button href="/register">Register</Button>
</Link>
);
};
isLoggedIn() 的代码是:
export const isLoggedIn = () => {
if (typeof window === "undefined") {
return false;
}
const token = window.localStorage.getItem("bearer_token");
if (!token) return false;
if (!tokenIsValid(token)) return false; // inspects the JWT token
return true;
};
我该如何解决这个问题?
解决方案
此问题的一种可能解决方案是评估用户是否使用组件中的状态挂钩HeaderButton
登录:
const HeaderButton = () => {
const [loggedIn, setLoggedIn] = useState(false); // logged out by default
useEffect(() => {
setLoggedIn(isLoggedIn()); // calculating logged in state within effect
});
// and watching the state
if (loggedIn) {
return (
<Link href="/profile" as="/profile">
<Button href="/profile">Profile</Button>
</Link>
);
}
return (
<Link href="/register" as="/register">
<Button href="/register">Register</Button>
</Link>
);
};
推荐阅读
- javascript - 使用 ng-repeat 访问嵌套的 json 以构建表
- macos - 在 Mac 上使用 Visual Studio Code 编译的 Fortran 导致“找不到 -lSystem 的库”
- excel - 为一个设定的范围排序
- string - Dart double toStringAsFixed 对数字进行四舍五入,但不应该
- c# - 从 JSON 文本中的 JArray 中提取值
- javascript - 如何检查值是否未定义,如果是,将其设置为 null
- vue.js - Nuxtjs 嵌套路由电子商务类别
- windows - What's wrong with repeating entries in awk print statements?
- datalog - 这是一个安全的数据记录规则吗?
- mercurial - 从 Mercurial repo 获取的 Bitbake 配方