Facebook React 基于 url 哈希渲染不同的组件
Facebook React to render different components based on url hash
如何根据更改后的散列 url 使反应 class 呈现?
这就是我的 React 代码现在的样子:
module.exports = React.createClass { render: () ->
div {},
div {},
a { href: '#testhash' }, 'test link'
div {},
if (window.location.hash.substring(1) is 'testhash')
'this is a test'
else
'this is a sentence'
}
但它只有效一次(即第一个 url 是什么 - 有或没有主题标签)。
我怎样才能使 url 散列更改(单击 href)在单击时被拾取?
也就是说,然后单击 test link
,页面应该显示 this is a test
而不是 this is a sentence
。
有没有更简单的方法可以做到这一点而无需添加状态值和按钮功能?
我需要使用 mixins 吗?
您可以为此使用一个简单的 mixin。 mixin 在内部使用状态和事件侦听器,但是这不会暴露给您的组件。您的组件只知道两个 public 方法:
this.getHash()
→String
this.isHash(String)
→Boolean
React.createClass {
mixins: [HashMixin()]
render: () ->
div {},
div {},
a { href: '#testhash' }, 'test link'
div {},
if @isHash 'testhash'
'this is a test'
else
'this is a sentence'
}
# provides getHash() to get the current hash
# provides isHash(hash) to test for equality with a hash
HashMixin = () ->
getState = () -> {__hash: window.location.hash.slice(1)}
getHash: () -> @state.__hash
isHash: (hash) -> @state.__hash is hash
getInitialState: getState
componentDidMount: () ->
window.addEventListener 'hashchange', @__update_hash_state, false
componentWillUnmount: () ->
window.removeEventListener 'hashchange', @__update_hash_state, false
__update_hash_state: () -> @setState getState()
对于更严肃的项目,您应该使用现有的路由库。 React 最流行的是 react-router。您还可以使用不特定于反应的路由器,并使用混合线将它们连接到您的组件(例如 director 或 backbone 的路由器)。
如何根据更改后的散列 url 使反应 class 呈现?
这就是我的 React 代码现在的样子:
module.exports = React.createClass { render: () ->
div {},
div {},
a { href: '#testhash' }, 'test link'
div {},
if (window.location.hash.substring(1) is 'testhash')
'this is a test'
else
'this is a sentence'
}
但它只有效一次(即第一个 url 是什么 - 有或没有主题标签)。
我怎样才能使 url 散列更改(单击 href)在单击时被拾取?
也就是说,然后单击 test link
,页面应该显示 this is a test
而不是 this is a sentence
。
有没有更简单的方法可以做到这一点而无需添加状态值和按钮功能?
我需要使用 mixins 吗?
您可以为此使用一个简单的 mixin。 mixin 在内部使用状态和事件侦听器,但是这不会暴露给您的组件。您的组件只知道两个 public 方法:
this.getHash()
→String
this.isHash(String)
→Boolean
React.createClass {
mixins: [HashMixin()]
render: () ->
div {},
div {},
a { href: '#testhash' }, 'test link'
div {},
if @isHash 'testhash'
'this is a test'
else
'this is a sentence'
}
# provides getHash() to get the current hash
# provides isHash(hash) to test for equality with a hash
HashMixin = () ->
getState = () -> {__hash: window.location.hash.slice(1)}
getHash: () -> @state.__hash
isHash: (hash) -> @state.__hash is hash
getInitialState: getState
componentDidMount: () ->
window.addEventListener 'hashchange', @__update_hash_state, false
componentWillUnmount: () ->
window.removeEventListener 'hashchange', @__update_hash_state, false
__update_hash_state: () -> @setState getState()
对于更严肃的项目,您应该使用现有的路由库。 React 最流行的是 react-router。您还可以使用不特定于反应的路由器,并使用混合线将它们连接到您的组件(例如 director 或 backbone 的路由器)。