我有一个Paginator
子组件,如果要在第一页上禁用左箭头按钮,如果在第一页上方,则要再次单击它。右箭头按钮也一样,但页面编号为5。
这是我尝试为此解决方案编写的条件:
if (this.state.page <= 1) {
this.setState({
disabledPrev: true
})
} else {
this.setState({
disabledPrev: false
})
}
if (this.state.page >= 5) {
this.setState({
disabledNext: true
})
} else {
this.setState({
disabledNext: false
})
}
但这不管我放在哪里都不管用。我认为问题出在生命周期方法的错误使用上。
这是整个代码:
App.js
import React from 'react';
import './App.css';
import Loading from './components/Loading/Loading';
import Header from './components/Header/Header';
import Table from './components/Table/Table';
import Paginator from './components/Paginator/Paginator';
const BASE_URL = 'https://api.udilia.com/coins/v1/'
export default class App extends React.Component{
constructor(props) {
super(props);
console.log('constructor');
this.state = {
currencies: null,
isDataReady: false,
page : 1,
disabledPrev: false,
disabledNext: false,
}
}
fetchCurrencies = (pageNumber) => {
fetch(`${BASE_URL}cryptocurrencies?page=${pageNumber}&perPage=20`)
.then(res => res.json())
.then(json => json.currencies)
.then(currencies => {
this.setState({
currencies: currencies,
isDataReady: true,
})
});
}
UNSAFE_componentWillMount() {
console.log('will mount', this.state.page);
}
componentDidUpdate() {
console.log('didUpdate', this.state.page);
}
componentDidMount() {
console.log('did mount', this.state.page);
//Here is the conditions
if (this.state.page <= 1) {
this.setState({
disabledPrev: true
})
} else {
this.setState({
disabledPrev: false
})
}
if (this.state.page >= 5) {
this.setState({
disabledNext: true
})
} else {
this.setState({
disabledNext: false
})
}
const {page} = this.state;
this.fetchCurrencies(page);
}
//here is the event handler, I change the page value from here
handlePaginationClick = (direction) => () => {
console.log('clicked', this.state.page);
let page = direction === 'next' ? this.state.page + 1 : this.state.page - 1;
this.setState({page})
this.fetchCurrencies(page);
}
render(){
console.log('render', this.state.page);
return (
!this.state.isDataReady
? <Loading />
: <div className="App">
<Header />
<Table
data={this.state.currencies}
/>
<Paginator
prev={this.handlePaginationClick('prev')}
next={this.handlePaginationClick('next')}
page={this.state.page}
disabledPrev={this.state.disabledPrev}
disabledNext={this.state.disabledNext}
/>
</div>
);
}
}
Paginator.js
import React from 'react';
export default function Paginator(props) {
return(
<div>
<button disabled={props.disabledPrev} onClick={() => props.prev()}> ← </button>
<span>page {props.page} of 10</span>
<button disabled={props.disabledNext} onClick={() => props.next()}> → </button>
</div>
)
}
最佳答案
试试这个
import React from 'react';
import './App.css';
import Loading from './components/Loading/Loading';
import Header from './components/Header/Header';
import Table from './components/Table/Table';
import Paginator from './components/Paginator/Paginator';
const BASE_URL = 'https://api.udilia.com/coins/v1/'
export default class App extends React.Component{
constructor(props) {
super(props);
console.log('constructor');
this.state = {
currencies: null,
isDataReady: false,
page : 1
}
}
fetchCurrencies = (pageNumber) => {
fetch(`${BASE_URL}cryptocurrencies?page=${pageNumber}&perPage=20`)
.then(res => res.json())
.then(json => json.currencies)
.then(currencies => {
this.setState({
currencies: currencies,
isDataReady: true,
})
});
}
UNSAFE_componentWillMount() {
console.log('will mount', this.state.page);
}
componentDidUpdate() {
console.log('didUpdate', this.state.page);
}
componentDidMount() {
console.log('did mount', this.state.page);
const {page} = this.state;
this.fetchCurrencies(page);
}
//here is the event handler, I change the page value from here
handlePaginationClick = (direction) => () => {
console.log('clicked', this.state.page);
let page = direction === 'next' ? this.state.page + 1 : this.state.page - 1;
this.setState({page})
this.fetchCurrencies(page);
}
render(){
console.log('render', this.state.page);
const {page} = this.state;
const disabledPrev = page <=1 ? true : false;
const disabledNext = page >=5 ? true : false;
return (
!this.state.isDataReady
? <Loading />
: <div className="App">
<Header />
<Table
data={this.state.currencies}
/>
<Paginator
prev={this.handlePaginationClick('prev')}
next={this.handlePaginationClick('next')}
page={page}
disabledPrev={disabledPrev}
disabledNext={disabledNext}
/>
</div>
);
}
}