javascript - prop oneOf array or default in React.js - Stack Overflow

admin2025-04-19  0

I want to create a ponent with prop in an array or use default value:

<Component lang="en"/> // this.props.lang == en
<Component lang="fr"/> // this.props.lang == fr

My ponent is not yet translated in italian so <Component lang="it"/> display a nice warning message:

Warning: Failed prop type: Invalid prop `lang` of value `it` supplied to `Component`, expected one of ["en","fr"].

The language of my ponent is equal to it, and I want to be equal to en. Any idea ?

import React from 'react';

const Component = React.createClass({
  propTypes: {
    lang: React.PropTypes.oneOf(['en', 'fr'])
  },
  getDefaultProps() {
    return {
      lang: 'en'
    };
  },
  render(){
    return (
      <h1>
        lang: {this.props.lang}
      </h1>
    );
  }
});

export default Component;

Here my tests :

import assert from 'assert';

import React from 'react';
import {mount} from 'enzyme';

import Component from './Component';

describe('<Component />', () => {
  it('get default prop', () => {
    const wrapper = mount(<Component />);
    assert.equal(wrapper.prop('lang'), 'en') // pass
  });
  it('get valid prop', () => {
    const wrapper = mount(<Component lang="fr"/>);
    assert.equal(wrapper.prop('lang'), 'fr') // pass
  });
  it('get invalid prop', () => {
    const wrapper = mount(<Component lang="it"/>);
    assert.equal(wrapper.prop('lang'), 'en') // fail
  });
});

I want to create a ponent with prop in an array or use default value:

<Component lang="en"/> // this.props.lang == en
<Component lang="fr"/> // this.props.lang == fr

My ponent is not yet translated in italian so <Component lang="it"/> display a nice warning message:

Warning: Failed prop type: Invalid prop `lang` of value `it` supplied to `Component`, expected one of ["en","fr"].

The language of my ponent is equal to it, and I want to be equal to en. Any idea ?

import React from 'react';

const Component = React.createClass({
  propTypes: {
    lang: React.PropTypes.oneOf(['en', 'fr'])
  },
  getDefaultProps() {
    return {
      lang: 'en'
    };
  },
  render(){
    return (
      <h1>
        lang: {this.props.lang}
      </h1>
    );
  }
});

export default Component;

Here my tests :

import assert from 'assert';

import React from 'react';
import {mount} from 'enzyme';

import Component from './Component';

describe('<Component />', () => {
  it('get default prop', () => {
    const wrapper = mount(<Component />);
    assert.equal(wrapper.prop('lang'), 'en') // pass
  });
  it('get valid prop', () => {
    const wrapper = mount(<Component lang="fr"/>);
    assert.equal(wrapper.prop('lang'), 'fr') // pass
  });
  it('get invalid prop', () => {
    const wrapper = mount(<Component lang="it"/>);
    assert.equal(wrapper.prop('lang'), 'en') // fail
  });
});
Share Improve this question asked Jul 20, 2016 at 13:22 Guillaume VincentGuillaume Vincent 14.9k14 gold badges79 silver badges104 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 5

The prop validation provided by React is really intended for debugging in development, not for production.

For what you're trying to achieve, you should build a custom helper method to convert the value if it's not something you're expecting.

import React from 'react';

const VALID_LANGS = ['en', 'fr'];

const Component = React.createClass({
  propTypes: {
    lang: React.PropTypes.oneOf(VALID_LANGS)
  },
  getDefaultProps() {
    return {
      lang: 'en'
    };
  },
  render() {
    return (
      <h1>
        lang: {this.getLang()}
      </h1>
    );
  },
  getLang() {
    return VALID_LANGS.indexOf(this.props.lang) !== -1 ? this.props.lang : VALID_LANGS[0];
  }
});

export default Component;

You'll need to update your test though, since you can't check if the prop is correct. Instead, you'll need to either check that the output matches what you expect, or that a child ponent is rendered with the correct "en" prop value.

Here another solution with state and getInitialState

import React from 'react';

const DEFAULT_LANG = 'en';
const LOCALES = {
  en: {},
  fr: {}
};

const Component = React.createClass({
  propTypes: {
    lang: React.PropTypes.oneOf(Object.keys(LOCALES))
  },
  getInitialState(){
    const lang = this.props.lang in LOCALES ? this.props.lang : DEFAULT_LANG;
    return {
      lang: lang
    };
  },
  getDefaultProps() {
    return {
      lang: 'en'
    };
  },
  render(){
    return (
      <h1>
        lang: {this.state.lang}
      </h1>
    );
  }
});

export default Component;

and my tests :

import assert from 'assert';

import React from 'react';
import {mount} from 'enzyme';

import Component from './Component';

describe('<Component />', () => {
  it('get default prop', () => {
    const wrapper = mount(<Component />);
    assert.equal(wrapper.state('lang'), 'en')
  });
  it('get valid prop', () => {
    const wrapper = mount(<Component lang="fr"/>);
    assert.equal(wrapper.state('lang'), 'fr')
  });
  it('get invalid prop', () => {
    const wrapper = mount(<Component lang="it"/>);
    assert.equal(wrapper.state('lang'), 'en')
  });
});
转载请注明原文地址:http://conceptsofalgorithm.com/Algorithm/1745075517a283544.html

最新回复(0)