LoginSignup
0
1

More than 5 years have passed since last update.

[React] withRouter を使っている component を Storybook でマウントする

Last updated at Posted at 2018-12-14

対象となる問題

withRouter で wrap している React component を Storybook でマウントした場合,
props.match.params が空オブジェクト {} になる.

このままだと,例えば /users/:id という URL で component をマウントしている場合,

// User.js
class User extends Component {
  constructor(props) {
    this.userId = props.match.params.id;
  }
  render() {
    return (
      ...
    );
  }
}

export default withRouter(User);
// Storybook
import User from './User';

stories.add('User component', () => (
  <MemoryRouter initialEntries={['/users/1']}>
    <User />
  </MemoryRouter>
));

というようなことをした時に props.match.params.id が 正しく取得できず,意図した動作にならない.

解決方法

withRouter で wrap する前の component を export して Storybook でマウントし,必要な props はその時に指定する.
history もその際に定義する.

// User.js
class User extends Component {
  constructor(props) {
    this.userId = props.match.params.id;
  }
  render() {
    return (
      ...
    );
  }
}

export { User };

export default withRouter(User);
// Storybook
import { User } from './User';

stories.add('User component', () => (
  <MemoryRouter initialEntries={['/users/1']}>
    <User match={{params: {id: 1}}} history={{push: () => {}} />
  </MemoryRouter>
));

もっといい解決方法があるような気がするので,ご存知の方がいらっしゃればご教示いただけるとありがたいです.

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1