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