6.0 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			6.0 KiB
		
	
	
	
	
	
	
	
id, title, challengeType, isRequired
| id | title | challengeType | isRequired | 
|---|---|---|---|
| 5a24c314108439a4d4036189 | Change Inline CSS Conditionally Based on Component State | 6 | false | 
Description
Instructions
3px solid red. You can try it out by entering text in the input.
Tests
tests:
  - text: The <code>GateKeeper</code> component should render a <code>div</code> element.
    testString: 'assert((function() { const mockedComponent = Enzyme.mount(React.createElement(GateKeeper)); return mockedComponent.find(''div'').length === 1; })(), ''The <code>GateKeeper</code> component should render a <code>div</code> element.'');'
  - text: The <code>GateKeeper</code> component should be initialized with a state key <code>input</code> set to an empty string.
    testString: 'assert((function() { const mockedComponent = Enzyme.mount(React.createElement(GateKeeper)); return mockedComponent.state().input === ''''; })(), ''The <code>GateKeeper</code> component should be initialized with a state key <code>input</code> set to an empty string.'');'
  - text: The <code>GateKeeper</code> component should render an <code>h3</code> tag and an <code>input</code> tag.
    testString: 'assert((function() { const mockedComponent = Enzyme.mount(React.createElement(GateKeeper)); return mockedComponent.find(''h3'').length === 1 && mockedComponent.find(''input'').length === 1; })(), ''The <code>GateKeeper</code> component should render an <code>h3</code> tag and an <code>input</code> tag.'');'
  - text: The <code>input</code> tag should initially have a style of <code>1px solid black</code> for the <code>border</code> property.
    testString: 'assert((function() { const mockedComponent = Enzyme.mount(React.createElement(GateKeeper)); return mockedComponent.find(''input'').props().style.border === ''1px solid black''; })(), ''The <code>input</code> tag should initially have a style of <code>1px solid black</code> for the <code>border</code> property.'');'
  - text: The <code>input</code> tag should be styled with a border of <code>3px solid red</code> if the input value in state is longer than 15 characters.
    testString: 'async () => {  const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 100)); const mockedComponent = Enzyme.mount(React.createElement(GateKeeper)); const simulateChange = (el, value) => el.simulate(''change'', {target: {value}}); let initialStyle = mockedComponent.find(''input'').props().style.border; const state_1 = () => { mockedComponent.setState({input: ''this is 15 char'' }); return waitForIt(() => mockedComponent.find(''input'').props().style.border )}; const state_2 = () => { mockedComponent.setState({input: ''A very long string longer than 15 characters.'' }); return waitForIt(() => mockedComponent.find(''input'').props().style.border )}; const style_1 = await state_1(); const style_2 = await state_2(); assert(initialStyle === ''1px solid black'' && style_1 === ''1px solid black'' && style_2 === ''3px solid red'', ''The <code>input</code> tag should be styled with a border of <code>3px solid red</code> if the input value in state is longer than 15 characters.''); }; '
Challenge Seed
class GateKeeper extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      input: ''
    };
    this.handleChange = this.handleChange.bind(this);
  }
  handleChange(event) {
    this.setState({ input: event.target.value })
  }
  render() {
    let inputStyle = {
      border: '1px solid black'
    };
    // change code below this line
    // change code above this line
    return (
      <div>
        <h3>Don't Type Too Much:</h3>
        <input
          type="text"
          style={inputStyle}
          value={this.state.input}
          onChange={this.handleChange} />
      </div>
    );
  }
};
After Test
console.info('after the test');
Solution
class GateKeeper extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      input: ''
    };
    this.handleChange = this.handleChange.bind(this);
  }
  handleChange(event) {
    this.setState({ input: event.target.value })
  }
  render() {
    let inputStyle = {
      border: '1px solid black'
    };
    if (this.state.input.length > 15) {
      inputStyle.border = '3px solid red';
    };
    return (
      <div>
        <h3>Don't Type Too Much:</h3>
        <input
          type="text"
          style={inputStyle}
          value={this.state.input}
          onChange={this.handleChange} />
      </div>
    );
  }
};