javascript - React - 在一种特定状态下更改 css 样式

标签 javascript css reactjs

我想做的是,如果输入值与 API 调用中的任何电影都不匹配,则将输入的边框更改为红色。 用户在输入字段中键入内容,调用 API 显示匹配结果。 如果我们没有任何结果,我希望输入的边框是红色的。 但我看不出我应该如何做到这一点。

组件 Input 位于代码片段的末尾。

CSS

.input-style {
  padding: 7px;
  border-radius: 5px;
  border: 1px solid #cccccc;
  font-family: Courier New, Courier, monospace;
  transition: background-color 0.3s ease-in-out;
  outline: none;
}
.input-style:focus {
  border: 1px solid turquoise;
}

APP.js

class App extends Component {
  constructor() {
    super();

    this.state = {
      value: '',
      items: [],
      isLoading: false,
      searchResult: null,
      error: false,
    };
    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  // To handle search
  handleChange(e) {
    this.setState({ value: e.target.value });
  }
  handleSubmit(e) {
    let searchResult = [];
    for (var i = 0; i < this.state.items.length; i++) {
      if (
        this.state.items[i].name
          .toLowerCase()
          .indexOf(this.state.value.toLowerCase()) !== -1
      ) {
        searchResult.push(this.state.items[i]);
      } else {
        console.log('No matches on your search, try again');
      }
    }
    e.preventDefault();

    // If we have something in the object searchResult
    if (searchResult.length > 0) {
      this.setState({
        error: false,
        value: '',
        searchResult: searchResult,
      });
    } else {
      this.setState({
        error: true,
        value: '',
        searchResult: [],
      });
    }
  }

  // call to the API
  componentDidMount() {
    this.setState({ isLoading: !this.state.isLoading });
    fetch('https://api.tvmaze.com/shows')
      .then(response => response.json())
      .then(data => {
        this.setState({
          items: data,
          error: false,
        });
        this.setState({ isLoading: !this.state.isLoading });
      })
      .catch(console.error);
  }

  render() {
    return (
      <div className="App">
        <Header />

        <Loader isLoading={this.state.isLoading} />

        <Input
          handleChange={this.handleChange}
          handleSubmit={this.handleSubmit}
          value={this.state.value}
        />

        {this.state.error ? (
          <p className="errorMsg">No match on the search, try again!</p>
        ) : null}

        <Search search={this.state.searchResult} />
      </div>
    );
  }
}

export default App;

Input.js

function Input(props) {
  return (
    <div>
      <form onSubmit={props.handleSubmit}>
        <input
          type="text"
          className="input-style"
          placeholder="Sök efter film.."
          value={props.value}
          onChange={props.handleChange}
        />

        <button id="bold" className="button-style" type="submit">
          <i className="fa fa-search" />
        </button>
      </form>
    </div>
  );
}
export default Input;

最佳答案

您可以将错误从 App

传递到 Input 组件
<Input
   handleChange={this.handleChange}
   handleSubmit={this.handleSubmit}
   value={this.state.value}
   error={this.state.error)
/>

在你的 Input 组件中:

 <input
   type="text"
   className={props.error ? 'error-input-style' : 'input-style'}
   placeholder="Sök efter film.."
   value={props.value}
   onChange={props.handleChange}
 />

您还可以为错误情况设置内联样式:

 <input
   type="text"
   className="input-style"
   placeholder="Sök efter film.."
   value={props.value}
   onChange={props.handleChange}
   style={{ border: props.error ? '1px solid red' : '' }}
 />

关于javascript - React - 在一种特定状态下更改 css 样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50942338/

相关文章:

reactjs - React Native 设置状态不起作用

javascript - React-router-dom 重定向不起作用 - 显示错误

javascript - Highcharts 饼图标签脱离父级

javascript - 带参数的 Ember 计算属性

css - 如何使用CSS样式化选择选项

javascript - 在 Safari iOS : Won't drag, 上拖放不会响应在桌面/iPad 上的拖放

html - 从另一个页面链接到一个页面的一部分

reactjs - 如何将多个 saga 添加到单个容器(两个 saga 监听不同的操作)

javascript - 是否可以将 Excel 工作表中的数据提供给 Chartist.js?

jquery - 用于 HTML5 音频问题的 javascript shim