同构react redux发送动态Id
Isomorphic react redux sending Dynamic Id
我正在为同构应用程序使用带有 redux 的 React 路由器。我有一个 href 需要同时在客户端和服务器端工作的用例。这主要是出于 SEO 的原因。对于机器人,它应该使用 href,当用户点击它时它也应该工作
我的路线是这样的
<Route name="app" component={ProductPage} path="/product/:Id">
<IndexRoute component={ProductContainer}/>
</Route>
http://localhost:3000/product/1234
(这在服务器端有效)
一旦上面的 URL 呈现数据,我的页面就会有不同的 URLS
http://localhost:3000/product/3456
http://localhost:3000/product/9999
当用户点击上面的 URLS 时,我不想做 post 返回,我想使用 browserHistory api 并渲染组件,是否可以?
我在容器里有这个
static needs = [
productActions.getProductData
]
任何方向都适用
服务器端
您可能需要一个函数调用来执行特定路由的 onEnter 调度,这将填充呈现组件所需的应用程序状态。
路线看起来像这样:
<Route component={ProductPage} path="/product/:Id" onEnter={requireProductData} />
requireProductData
将是您 main.js 中的一个函数,如下所示:
function requireProductData(nextState, replace, callback) {
const { params } = nextState
var idNum = parseInt(params.id.toString().split("-")[0])
const currentState = store.getState()
if (idNum > 0) {
store.dispatch(ProductActionCreators.productInfo({ id: idNum })).then((event) => {
callback()
}, (error) => {
callback()
})
} else {
callback()
}
}
这会执行您的 action creator 调用,然后您的 reducer 会处理应用程序状态。然后你可以从 url.
渲染你的组件
客户端
是的,您关于执行 onClick 处理程序的说法是正确的。下面是单击按钮会导致 API 调用并进行调度的示例:
class SubscribeUserDialog extends Component {
subscribeUser(privacy) {
const { dispatch, readingPlan, auth } = this.props
if (!auth.isLoggedIn) window.location.replace(`/sign-in`)
// if user isn't subscribed, then subscribe!
if (!readingPlan.subscription_id) {
dispatch(ActionCreators.readingplanSubscribeUser({ id: readingPlan.id , private: privacy }, auth.isLoggedIn)).then(() => {
// redirect to plan
this.goToPlan()
})
} else {
// user already subscribed
this.goToPlan()
}
}
render() {
return (
<div className='plan-privacy-buttons text-center'>
<p className='detail-text'><FormattedMessage id="plans.privacy.visible to friends?" /></p>
<div className='yes-no-buttons'>
<a className='yes solid-button green' onClick={this.subscribeUser.bind(this, false)}><FormattedMessage id="ui.yes button"/></a>
<a className='no solid-button gray' onClick={this.subscribeUser.bind(this, true)}><FormattedMessage id="ui.no button" /></a>
</div>
</div>
)
}
}
export default SubscribeUserDialog
在您的情况下,您会将 onClick 附加到您的链接。
这对你有帮助吗?
我正在为同构应用程序使用带有 redux 的 React 路由器。我有一个 href 需要同时在客户端和服务器端工作的用例。这主要是出于 SEO 的原因。对于机器人,它应该使用 href,当用户点击它时它也应该工作
我的路线是这样的
<Route name="app" component={ProductPage} path="/product/:Id">
<IndexRoute component={ProductContainer}/>
</Route>
http://localhost:3000/product/1234
(这在服务器端有效)
一旦上面的 URL 呈现数据,我的页面就会有不同的 URLS
http://localhost:3000/product/3456
http://localhost:3000/product/9999
当用户点击上面的 URLS 时,我不想做 post 返回,我想使用 browserHistory api 并渲染组件,是否可以?
我在容器里有这个
static needs = [
productActions.getProductData
]
任何方向都适用
服务器端
您可能需要一个函数调用来执行特定路由的 onEnter 调度,这将填充呈现组件所需的应用程序状态。
路线看起来像这样:
<Route component={ProductPage} path="/product/:Id" onEnter={requireProductData} />
requireProductData
将是您 main.js 中的一个函数,如下所示:
function requireProductData(nextState, replace, callback) {
const { params } = nextState
var idNum = parseInt(params.id.toString().split("-")[0])
const currentState = store.getState()
if (idNum > 0) {
store.dispatch(ProductActionCreators.productInfo({ id: idNum })).then((event) => {
callback()
}, (error) => {
callback()
})
} else {
callback()
}
}
这会执行您的 action creator 调用,然后您的 reducer 会处理应用程序状态。然后你可以从 url.
渲染你的组件客户端
是的,您关于执行 onClick 处理程序的说法是正确的。下面是单击按钮会导致 API 调用并进行调度的示例:
class SubscribeUserDialog extends Component {
subscribeUser(privacy) {
const { dispatch, readingPlan, auth } = this.props
if (!auth.isLoggedIn) window.location.replace(`/sign-in`)
// if user isn't subscribed, then subscribe!
if (!readingPlan.subscription_id) {
dispatch(ActionCreators.readingplanSubscribeUser({ id: readingPlan.id , private: privacy }, auth.isLoggedIn)).then(() => {
// redirect to plan
this.goToPlan()
})
} else {
// user already subscribed
this.goToPlan()
}
}
render() {
return (
<div className='plan-privacy-buttons text-center'>
<p className='detail-text'><FormattedMessage id="plans.privacy.visible to friends?" /></p>
<div className='yes-no-buttons'>
<a className='yes solid-button green' onClick={this.subscribeUser.bind(this, false)}><FormattedMessage id="ui.yes button"/></a>
<a className='no solid-button gray' onClick={this.subscribeUser.bind(this, true)}><FormattedMessage id="ui.no button" /></a>
</div>
</div>
)
}
}
export default SubscribeUserDialog
在您的情况下,您会将 onClick 附加到您的链接。
这对你有帮助吗?