输入中的自动完成数据

Autocomplete data in input

我想在输入中显示来自自动完成的数据,如下所示:

Autocomplete function

当我尝试执行此操作时出现错误:

× 类型错误:无法读取未定义的 属性 'setState' onSelect

94 | onSelect={ value => this.setState({ value }) }

我坚持这个,我可能做错了。希望有人可以帮助我,因为我已经尝试了我所知道的一切,但看不到问题所在。所以请帮助我:)

privateMovie.js

import React, { useState, useEffect, setState } from "react";
import Layout from "../core/Layout";
import axios from "axios";
import { isAuth, getCookie, signout, updateUser } from "../auth/helpers";
import { ToastContainer, toast } from "react-toastify";
import "react-toastify/dist/ReactToastify.min.css";
import Autocomplete from "react-autocomplete";
import { MoviesData, renderMovieTitle } from "./movie-data";

const Private = ({ history }) => {
  const [values, setValues ] = useState({
    value: "",
    suggestions: [],
    movie: "",
    buttonText: "Submit"
  });

  const token = getCookie("token");

  useEffect(() => {
    loadProfile();
  }, []);

  const loadProfile = () => {
    axios({
      method: "get",
      url: `${process.env.REACT_APP_API}/user/${isAuth()._id}`,
      headers: {
        Authorization: `Bearer ${token}`
      }
    })
      .then(response => {
        console.log("PRIVATE PROFILE UPDATE", response);
        const { movie } = response.data;
        setValues({ ...values, movie });
      })
      .catch(error => {
        console.log("PRIVATE PROFILE UPDATE ERROR", error.response.data.error);
        if (error.response.status === 401) {
          signout(() => {
            history.push("/");
          });
        }
      });
  };

  const { movie, buttonText } = values;

  const handleChange = value => event => {
    // console.log(event.target.value);
    setValues({ ...values, [value]: event.target.value });
  };

  const clickSubmit = event => {
    event.preventDefault();
    setValues({ ...values, buttonText: "Submitting" });
    axios({
      method: "POST",
      url: `${process.env.REACT_APP_API}/movie/create`,
      headers: {
        Authorization: `Bearer ${token}`
      },
      data: { movie }
    })
      .then(response => {
        console.log("PRIVATE PROFILE UPDATE SUCCESS", response);
        updateUser(response, () => {
          setValues({ ...values, buttonText: "Submitted" });
          toast.success("Profile updated successfully");
        });
      })
      .catch(error => {
        console.log("PRIVATE PROFILE UPDATE ERROR", error.response.data.error);
        setValues({ ...values, buttonText: "Submit" });
        toast.error(error.response.data.error);
      });
  };

  const updateForm = () => (
    <form>
      <div className="form-group">
        <label className="text-muted">AUTOCOMPLETE</label>
        <Autocomplete
        type="text"
          getItemValue={item => item.title}
          items={MoviesData()}
          shouldItemRender={renderMovieTitle}
          renderItem={(item, isHighlighted) => (
            <div style={{ background: isHighlighted ? "lightgray" : "white" }}>
              {item.title}
            </div>
          )}
          onChange={(event, value) => this.setState({ value }) }
          onSelect={ value => this.setState({ value }) }
        />
        <input
          onChange={handleChange("movie")}
          value={movie}
          type="text"
          className="form-control"
        />
      </div>
      <div>
        <button className="btn btn-primary" onClick={clickSubmit}>
          {buttonText}
        </button>
      </div>
    </form>
  );

  return (
    <Layout>
      <div className="col-md-6 offset-md-3">
        <ToastContainer />
        <h1 className="pt-5 text-center"></h1>
        <p className="lead text-center"></p>
        {updateForm()}
      </div>
    </Layout>
  );
};

export default Private;


我想你搞混了。

相反,您调用 this.setState()

调用你的析构函数 setValues()

你已经在你的组件函数的开头声明了

 const [values, setValues ] = useState({
    value: "",
    suggestions: [],
    movie: "",
    buttonText: "Submit"
  });

如果您使用“useState”并在“getValues”和“setValues”中破坏它,您可以在导入中删除 setState。

查看文档:

https://reactjs.org/docs/hooks-state.html