React/Redux,正在重新加载路由中的组件
React/Redux, Reloading a component in route
我在基本的 CRUD 屏幕中有典型的行列表,每一行都像往常一样 link:
<Link to={"/appointment/"+appointment.id+"/"}>Edit</Link>
我的路线是:
<Route path="/appointment/:id" component={AppoModal} />
当我在任意行中单击 "Edit" 时,会出现模态对话框:
如果我点击第一个 "Edit" link 一切正常。但是如果我在对话框中按下 "Close" 按钮并尝试再次单击任何 "Edit" link,模式对话框不会启动,我猜这是因为组件已经 "up".
对话的hide/show行为由AppoModal组件中的this.state.showModal值控制:
constructor(props) {
super(props);
this.state = { showModal: true };
}
所以我不知道如何 "reload" 或 "re run" 组件。每次单击 "Edit" link 时,我可以 运行 发送(操作)吗?我听说过 "static method",但我是 React 的新手,不知道那是否是路径。
谢谢!
出现问题是因为当您单击“关闭”时,您更改的是组件状态,但并未更改应用程序状态。
由于您的模式随着路线更改而打开,因此它也应该随着路线更改而关闭。
您可以采取不同的方法,同时避免路线变更。由于您使用的是 redux,因此您可能有一个全局状态,它可以包含一个模态名称作为常量,或者可能包含对组件的引用。
现在您可以拥有一个模态组件,它会根据全局状态变化呈现组件,您可以在根组件的某处调用此组件。
所以你的减速器看起来像
export function modalState(state=null, action) {
if(action.payload.name == "CLOSE_MODAL") return null;
else if([/*modal names*/].includes(action.payload.name) {
return {modal: action.payload.name, .data: action.payload.data}
} else return {...state}
}
你有一个像
这样的动作
export function openModal(name, data) {
return {
type: "MODAL_NAME",
payload: { name, data }
}
export function closeModal() {
return { type: "CLOSE_MODAL", payoad: null }
}
你的组件看起来像
const componentMaps = {
[MODAL_1] : import MODAL_1 from "./modals/Modal_1.jsx"
}
cont Modal = React.createClass({
render: function() {
let Component = componentMaps[this.props.modal.name]
if(Component) {
return <Component {...this.props.modal.data}/>
} else {
return null;
}
}
});
export connect(select)(Modal);
我在基本的 CRUD 屏幕中有典型的行列表,每一行都像往常一样 link:
<Link to={"/appointment/"+appointment.id+"/"}>Edit</Link>
我的路线是:
<Route path="/appointment/:id" component={AppoModal} />
当我在任意行中单击 "Edit" 时,会出现模态对话框:
如果我点击第一个 "Edit" link 一切正常。但是如果我在对话框中按下 "Close" 按钮并尝试再次单击任何 "Edit" link,模式对话框不会启动,我猜这是因为组件已经 "up".
对话的hide/show行为由AppoModal组件中的this.state.showModal值控制:
constructor(props) {
super(props);
this.state = { showModal: true };
}
所以我不知道如何 "reload" 或 "re run" 组件。每次单击 "Edit" link 时,我可以 运行 发送(操作)吗?我听说过 "static method",但我是 React 的新手,不知道那是否是路径。
谢谢!
出现问题是因为当您单击“关闭”时,您更改的是组件状态,但并未更改应用程序状态。
由于您的模式随着路线更改而打开,因此它也应该随着路线更改而关闭。
您可以采取不同的方法,同时避免路线变更。由于您使用的是 redux,因此您可能有一个全局状态,它可以包含一个模态名称作为常量,或者可能包含对组件的引用。
现在您可以拥有一个模态组件,它会根据全局状态变化呈现组件,您可以在根组件的某处调用此组件。
所以你的减速器看起来像
export function modalState(state=null, action) {
if(action.payload.name == "CLOSE_MODAL") return null;
else if([/*modal names*/].includes(action.payload.name) {
return {modal: action.payload.name, .data: action.payload.data}
} else return {...state}
}
你有一个像
这样的动作export function openModal(name, data) {
return {
type: "MODAL_NAME",
payload: { name, data }
}
export function closeModal() {
return { type: "CLOSE_MODAL", payoad: null }
}
你的组件看起来像
const componentMaps = {
[MODAL_1] : import MODAL_1 from "./modals/Modal_1.jsx"
}
cont Modal = React.createClass({
render: function() {
let Component = componentMaps[this.props.modal.name]
if(Component) {
return <Component {...this.props.modal.data}/>
} else {
return null;
}
}
});
export connect(select)(Modal);