基于 token 的 React Native 条件渲染,组件状态内部不存储
React Native conditional rendering based on token without storage inside component state
我目前正在使用 react-native-keychain
来安全地存储访问令牌。这在大多数情况下都运行良好,但我在尝试根据令牌是否可用有条件地呈现组件时遇到问题。
目前我的代码看起来像这样:
function Questionnaire() {
const [token, setToken] = useState(null);
Keychain.getGenericPassword().then(credentials => {
const token = credentials.password.replace('Bearer ', '');
setToken(token);
});
if (token != null) {
return (
<WebView
source={{
uri: `url?token=${token}`,
}}
...
/>
);
} else {
return <Text>Loading...</Text>;
}
}
这里可以进行条件渲染,但我将令牌简单地存储在我想避免的状态中。
我试过这样做:
function Questionnaire() {
const [token, setToken] = useState(null);
return (
<View>
{(() => {
Keychain.getGenericPassword().then(credentials => {
const token = credentials.password.replace('Bearer ', '');
return
(
<View>
... // do something with the token
</View>
);
});
})()}
</View>
);
}
但这只是 returns 没什么(因为它可能是一个承诺)。
我该如何着手解决这类问题?
编辑
我也尝试过获取网页并将其放入状态。问题在于这只是一个 html 页面,因此在 webview 中呈现的页面不是很实用。
React 不允许您等待、延迟或延迟渲染。你必须渲染一些东西,然后你可以在你的 promise 解决时替换它。你应该把你的副作用放在 useEffect 钩子或 componentDidMount 生命周期方法中。
我选择仍将令牌存储在状态中,但在 useEffect 挂钩的匿名清理函数中重置令牌。
function Questionnaire() {
const [token, setToken] = useState(null);
const navigation = useNavigation();
useEffect(() => {
Keychain.getGenericPassword().then(credentials => {
const token = credentials.password.replace('Bearer ', '');
setToken(token);
});
return () => {
setToken(null); // reset the token stored in the questionnaire state (token can still be retrieved from keychain)
};
}, []);
return token ? (
<WebView
source={{
uri: url?token=${token},
}}
...
/>
) : (
<Text>Loading...</Text>
);
}
我目前正在使用 react-native-keychain
来安全地存储访问令牌。这在大多数情况下都运行良好,但我在尝试根据令牌是否可用有条件地呈现组件时遇到问题。
目前我的代码看起来像这样:
function Questionnaire() {
const [token, setToken] = useState(null);
Keychain.getGenericPassword().then(credentials => {
const token = credentials.password.replace('Bearer ', '');
setToken(token);
});
if (token != null) {
return (
<WebView
source={{
uri: `url?token=${token}`,
}}
...
/>
);
} else {
return <Text>Loading...</Text>;
}
}
这里可以进行条件渲染,但我将令牌简单地存储在我想避免的状态中。
我试过这样做:
function Questionnaire() {
const [token, setToken] = useState(null);
return (
<View>
{(() => {
Keychain.getGenericPassword().then(credentials => {
const token = credentials.password.replace('Bearer ', '');
return
(
<View>
... // do something with the token
</View>
);
});
})()}
</View>
);
}
但这只是 returns 没什么(因为它可能是一个承诺)。
我该如何着手解决这类问题?
编辑
我也尝试过获取网页并将其放入状态。问题在于这只是一个 html 页面,因此在 webview 中呈现的页面不是很实用。
React 不允许您等待、延迟或延迟渲染。你必须渲染一些东西,然后你可以在你的 promise 解决时替换它。你应该把你的副作用放在 useEffect 钩子或 componentDidMount 生命周期方法中。
我选择仍将令牌存储在状态中,但在 useEffect 挂钩的匿名清理函数中重置令牌。
function Questionnaire() {
const [token, setToken] = useState(null);
const navigation = useNavigation();
useEffect(() => {
Keychain.getGenericPassword().then(credentials => {
const token = credentials.password.replace('Bearer ', '');
setToken(token);
});
return () => {
setToken(null); // reset the token stored in the questionnaire state (token can still be retrieved from keychain)
};
}, []);
return token ? (
<WebView
source={{
uri: url?token=${token},
}}
...
/>
) : (
<Text>Loading...</Text>
);
}