【发布时间】:2019-10-31 02:46:28
【问题描述】:
我正在设计一个 UI 原型并从 React 中这样的 API 获取数据:
componentWillUpdate() {
fetch(this.state.api + this.state.query +".json" + this.state.key)
.then(response => {
if (response.ok) {
return response.json();
} else {
throw new Error('Oops')
}
})
.then(data => this.setState({ results: data.results, isLoading: false}))
.catch(error => this.setState({ error, isLoading: false }))
}
我想让用户访问其他可能的类别列表。给定这样的链接:
<li data-facet="arts" onClick={this.handleCategory}>Arts</li>
还有一个像这样的处理方法:
handleCategory(event) {
this.setState({
query: event.target.getAttribute('data-facet')
})
}
如何让 UI 更新和显示新类别的数据?这几天我一直在努力解决这个问题。我已经编写了几种成功更新获取字符串的方法,但没有一种方法会强制组件重新渲染并显示新项目。谢谢。
更新完整的组件代码:
import React, { Component } from 'react'
import Moment from 'moment'
import MaterialIcon from 'material-icons-react'
import '../assets/styles/app.scss'
class App extends Component {
constructor(props) {
super(props);
this.state = {
error: null,
isLoading: false,
isMenuOpen: false,
results: [],
api: "the//api//here",
query: "",
key: "?api-key=XXXXXX"
};
this.handleMenu = this.handleMenu.bind(this)
this.handleCategory = this.handleCategory.bind(this)
}
handleMenu() {
this.setState({
isMenuOpen: !state.isMenuOpen
})
}
handleCategory(event) {
this.setState({
query: event.target.getAttribute('data-facet')
})
}
componentDidMount() {
fetch(this.state.api + this.state.query +".json" + this.state.key)
.then(response => {
if (response.ok) {
return response.json();
} else {
throw new Error('Oops')
}
})
.then(data => this.setState({ results: data.results, isLoading: false}))
.catch(error => this.setState({ error, isLoading: false }))
}
render() {
const { results, isLoading, error } = this.state
if (error) {
return <div className="cards">{error.message}</div>
}
if (isLoading) {
return <div className="cards">Loading...</div>;
}
return (
<div className="wrapper">
<div className="menu-trigger"><MaterialIcon icon="menu"/></div>
<div className="menu">
<ul>
<li data-facet="arts" onClick={this.handleCategory}>Arts</li>
<li data-facet="automobiles" onClick={this.handleCategory}>Automobiles</li>
<li data-facet="books" onClick={this.handleCategory}>Books</li>
<li data-facet="business" onClick={this.handleCategory}>Business</li>
<li data-facet="fashion" onClick={this.handleCategory}>Fashion</li>
<li data-facet="food" onClick={this.handleCategory}>Food</li>
<li data-facet="health" onClick={this.handleCategory}>Health</li>
<li data-facet="home" onClick={this.handleCategory}>Home</li>
</ul>
</div>
<div className="cards">
{results.slice(0, 10).map(result => (
<div className="cards__card" key={result.title}>
<a href={result.url} target="_blank"><h5>{result.title}</h5></a>
<p>{result.abstract}</p>
<p className="small">Published {Moment(result.published_date).format('MMMM Do YYYY, h:mm a')}</p>
</div>
))}
</div>
</div>
);
}
}
export default App
【问题讨论】:
-
你能告诉我为什么你在 componentWillUpdate 中调用 api 而不是 componentDidMount 吗?还分享完整的代码,以便我检查。
-
我已经更新了包含完整代码的问题。我在
componentWillUpdate()中获取信息,只是因为我在胡闹。它一直在componentDidMount并且正在工作。 -
你的表现不会很好,因为你在 li 标签中使用了多个相同的点击功能。我认为你应该循环并通过 id/value 处理。
-
你能在沙盒中分享,以便我改进。
-
很高兴!我该怎么做?你的意思是做一个 Codepen 什么的?