开发者问题收集

Reactjs TypeError:从 url 读取参数时无法读取未定义的属性“props”

2020-08-29
54

我有两个页面,一个用于搜索,一个用于结果。在搜索页面中,您提交一个包含搜索项的表单,然后将其传递到 url 中。在结果页面中,我尝试读取该参数并将其作为变量传递给我在那里的函数,但是我一直收到以下错误:

TypeError:无法读取未定义的属性“props”

这是我的搜索页面:

class Search extends Component {

  constructor(props){
    super(props)
    this.state = {
      search: ''
    }
  }

  handleSubmit = (event) => {
    event.preventDefault()
    const data = this.state
    this.props.history.push('/search/' + data.search);
  }

  handleInputChange = (event) => {
    event.preventDefault()
    this.setState({
      [event.target.name]: event.target.value
    })
  }
  
  render(){
    const {search} = this.state
    return (
      <div>
        <p>What are you searching for?</p>
        <form onSubmit={this.handleSubmit}>
          <p><input type="text" placeholder="Search" name="search" onChange={this.handleInputChange}></input></p>
          <p><button>Search!</button></p>
        </form>
      </div>
    )
  }
}

然后在结果页面中我有此代码:

function Result() {


  const ListLoading = withListLoading(List);
  const [appState, setAppState] = useState({
    loading: false,
    products: null,
  });

  useEffect(() => {
    setAppState({ loading: true });
    const baseUrl = "http://localhost:8080/"
    const searchItem = this.props.params.search
    let urls = [];
    const allUrls = shops.map((shop) => {
      let url = baseUrl + searchItem;
      urls.push(url)
    });

    function fetchData() {
      const allRequests = urls.map(url =>
        fetch(url).then(response => response.json())
      );
      return Promise.all(allRequests);
    };

    fetchData().then(arrayOfResponses => 
      setAppState({loading: false, products: arrayOfResponses}),
    );
  }, [setAppState]);
  return (
    <div className='App'>
      <div className='container'>
        <h1>Products</h1>
      </div>
      <div className='repo-container'>
        <ListLoading isLoading={appState.loading} products={appState.products} />
      </div>
      <footer>
      </footer>
    </div>
  );
}
export default Result;

该函数将调用我在本地主机上运行的另一个应用程序。 我设置了变量 const searchItem = this.props.params.search ,但这似乎不起作用。

我还能如何从 url 中读取参数并将其设为变量?

1个回答

props 作为参数传递给函数组件。您无法通过“this”访问它们:

function Result (props) {
  // do stuff with props, not this.props
}

另一个可能存在问题的观察结果:

onSubmit={this.handleSubmit 更改为 onSubmit={e => this.handleSubmit(e)

问题是,当您在对象上调用方法时,范围(“this”在函数内部所代表的内容)设置为调用该方法的对象。因此,当您执行以下操作时:

this.handleSubmit()

…在 handleSubmit 函数中,“this”仍然是您的组件。

但是,如果您将其分离并作为常规函数单独调用它:

const fn = this.handleSubmit;
fn() // “this” isn’t set; it’s undefined inside the function

范围就会丢失。因此当您尝试执行 this.props 时它会崩溃,因为“this”未定义。

ray
2020-08-29