ctr*_*eon 8 javascript reactjs react-redux react-hooks redux-toolkit
我想做什么?
使用 Redux Toolkit,我尝试从名为 的非 React 文件访问值的“存储”,特别是我为其创建“切片”的“用户名” SomeFile.js。
目前尝试执行此操作的代码是什么?
// userMetadataSlice.js
import { createSlice } from "@reduxjs/toolkit";
const initialState = {
username: "",
};
const userMetadataSlice = createSlice({
name: "userMetadata",
initialState,
reducers: {
updateUsername: (state, action) => {
const username = action.payload;
state.username = username;
},
},
});
export const { updateUsername } = userMetadataSlice.actions;
export default userMetadataSlice.reducer;
export const selectUsername = (state) => {
return state.userMetadata.username;
}
Run Code Online (Sandbox Code Playgroud)
// SomeFile.js
import { selectUsername } from "../redux/userMetadataSlice";
import { useSelector } from "react-redux";
export const displayUsername = () => {
const username = useSelector(selectUsername);
console.log("Username:", username); // Error.
}
Run Code Online (Sandbox Code Playgroud)
我期望结果是什么?
能够从“商店”中提取用户名。
实际结果如何?
当我尝试通过非反应文件中的“useSelector”访问该值时,会发生错误:React Hook "useSelector" is called in function "selectUsername" which is neither a React function component or a custom React Hook function
我认为问题可能是什么?
SomeFile.js其中没有任何与 React 相关的内容,因为它只是从存储中提取数据并输出数据。
我尝试过的有效解决方案是这样做:
// userMetadataSlice.js
import { createSlice } from "@reduxjs/toolkit";
const initialState = {
username: "",
};
const userMetadataSlice = createSlice({
name: "userMetadata",
initialState,
reducers: {
updateUsername: (state, action) => {
const username = action.payload;
state.username = username;
},
},
});
export const { updateUsername } = userMetadataSlice.actions;
export default userMetadataSlice.reducer;
export const selectUsername = (state) => {
return state.userMetadata.username;
}
// New code here!
export function SelectUsername() {
const username = useSelector(selectUsername);
return username;
}
Run Code Online (Sandbox Code Playgroud)
// SomeFile.js
import { SelectUsername } from "../redux/userMetadataSlice";
export const displayUsername = () => {
console.log("Username:", SelectUsername); // No errors, shows correct output.
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找的解决方案是这样的:
\n\n我提出的解决方案是从非 React 文件中的\n“存储”接收信息的“正确”方式吗?
\n
不,它滥用了 Hooks 规则和 React 函数。您直接调用SelectUsernameReact 函数。
\n\n有没有针对此的自定义挂钩解决方案?
\n
不,React hooks 仅适用于 React 函数和自定义 React hooks。
\n您可以从 Reduxstore对象访问您的状态。
从您创建的store对象中,您将有一个getState可以调用的方法。
\n\n\n
getState()\xe2\x80\x8b返回应用程序的当前状态树。它等于存储的减速器返回的最后一个值。
\n返回\xe2\x80\x8b
\n(任意):应用程序的当前状态树。
\n
您可以导出创建的商店对象以导入到非 React JS 文件中,并且它们可以调用该getStore方法。
import store from \'../path/to/store\';\n\n...\n\nconst state = store.getState();\nRun Code Online (Sandbox Code Playgroud)\nuseSelectorReact 钩子在react-reduxReact 组件之外无法工作,但selectUsername状态选择器函数可以。
// SomeFile.js\nimport store from \'../path/to/store\';\nimport { selectUsername } from "../redux/userMetadataSlice";\n\n...\n\nexport const displayUsername = () => {\n const state = store.getState();\n\n const username = selectUsername(state);\n\n console.log("Username:", username);\n\n return username;\n};\nRun Code Online (Sandbox Code Playgroud)\n请参阅其他存储方法以订阅状态更改并从 React 外部将操作分派到您的存储。
\n| 归档时间: |
|
| 查看次数: |
10782 次 |
| 最近记录: |