用React编写的Chrome扩展程序中的路由

Max*_*yuk 5 javascript url-routing google-chrome-extension reactjs react-router

我的Chrome扩展程序中有2个页面.例如:第一个(默认)页面包含用户列表,第二个页面包含此用户的操作.

我想通过点击用户显示第二页(ClickableListItem在我的情况下).我使用React和React Router.这是我所拥有的组件:

class Resents extends React.Component {
constructor(props) {
  super(props);
  this.handleOnClick = this.handleOnClick.bind(this);
}
handleOnClick() {
  console.log('navigate to next page');
  const path = '/description-view';
  browserHistory.push(path);
}
render() {
  const ClickableListItem = clickableEnhance(ListItem);
  return (
    <div>
      <List>
        <ClickableListItem
          primaryText="Donald Trump"
          leftAvatar={<Avatar src="img/some-guy.jpg" />}
          rightIcon={<ImageNavigateNext />}
          onClick={this.handleOnClick}
        />
      // some code missed for simplicity
      </List>
    </div>
  );
}
}
Run Code Online (Sandbox Code Playgroud)

我也试图包装ClickableListItemLink组件(从react-router)但它什么也没做.

也许事情是Chrome扩展程序没有他们的browserHistory...但我没有看到控制台中的任何错误...

使用React进行路由可以做些什么?

Pau*_*l S 8

虽然您不希望为扩展使用浏览器(或哈希)历史记录,但您可以使用内存历史记录.内存历史记录复制浏览器历史记录,但维护自己的历史记录堆栈.

import { createMemoryHistory } from 'history'
const history = createMemoryHistory()
Run Code Online (Sandbox Code Playgroud)

对于只有两页的扩展,使用React Router是过度的.在状态中维护一个值更简单,描述要呈现哪个"页面"并使用switch或if/else语句来仅呈现正确的页面组件.

render() {
  let page = null
  switch (this.state.page) {
  case 'home':
    page = <Home />
    break
  case 'user':
    page = <User />
    break
  }
  return page
}
Run Code Online (Sandbox Code Playgroud)


Sne*_*ake 6

我知道这个帖子很旧。尽管如此,我还是将我的答案留在这里,以防万一有人仍在寻找它并想要快速回答来修复他们现有的路由器。

就我而言,我只是从 切换BrowserRouterMemoryRouter。它就像魅力一样,无需额外的memory包装!

import { MemoryRouter as Router } from 'react-router-dom';

ReactDOM.render(
    <React.StrictMode>
        <Router>
            <OptionsComponent />
        </Router>
    </React.StrictMode>,
    document.querySelector('#root')
);
Run Code Online (Sandbox Code Playgroud)

您可以在ReactRouter 文档中尝试其他适合您的方法


Max*_*yuk 5

我通过使用单个路由而不是嵌套路由解决了这个问题。问题出在另一个地方...

另外,我创建了一个问题:https ://github.com/ReactTraining/react-router/issues/4309