Reactjs 单击几下后,分页项返回未定义
我有一个从api返回数据并呈现数据的应用程序页面。数据限制为每页20条记录。我正在尝试添加分页,分页页面项似乎工作正常。如果单击页面,偏移量将根据请求的页面、重新获取和呈现的数据进行调整。 我现在已经在分页中添加了一个上一页和第一页项目,这在开始时似乎是有效的,但是在其他页面项目上单击几下之后,单击只会返回未定义的 主页的代码如下所示:Reactjs 单击几下后,分页项返回未定义,reactjs,gatsby,react-bootstrap,Reactjs,Gatsby,React Bootstrap,我有一个从api返回数据并呈现数据的应用程序页面。数据限制为每页20条记录。我正在尝试添加分页,分页页面项似乎工作正常。如果单击页面,偏移量将根据请求的页面、重新获取和呈现的数据进行调整。 我现在已经在分页中添加了一个上一页和第一页项目,这在开始时似乎是有效的,但是在其他页面项目上单击几下之后,单击只会返回未定义的 主页的代码如下所示: import React, { useState, useEffect, useMemo, useCallback } from "react&quo
import React, { useState, useEffect, useMemo, useCallback } from "react"
import { Link } from "gatsby"
import { withAuthenticator, Loading } from 'aws-amplify-react'
import request from "../utilities/request"
import SEO from "../components/seo"
import Container from 'react-bootstrap/Container'
import Row from 'react-bootstrap/Row'
import Col from 'react-bootstrap/Col'
import Table from 'react-bootstrap/Table'
import { currLocale, formatDate } from '../utilities/formatting'
import BasicPagination from '../components/pagination'
const ProductionOrders = (props) => {
const [offset,setOffset] = useState(0)
let records = 20
const [orders, setOrders] = useState({})
const [isLoading, setIsLoading] = useState(true)
const [activePage, setActivePage] = useState(0)
const [totalPages, setTotalPages] = useState()
const handlePrev = (e) => {
console.log(activePage)
if (activePage <=1) {return}
setOffset(offset-records)
}
const handleClick = (e) => {
e.preventDefault()
e.persist()
console.log(e.target.attributes.value)
const pageRequested = parseInt(e.target.attributes.value.value)
console.log(`pageRequested${pageRequested}`)
if (pageRequested =='prev') {
setActivePage(activePage-1)
return }
if (pageRequested === activePage) {return}
setOffset((pageRequested-1)*records)
console.log(e.target.attributes.value.value)
console.log(offset)
}
function isEmpty(obj) {
for (var key in obj) {
if (obj.hasOwnProperty(key))
return false;
}
return true;
}
useEffect(() => {
async function fetchOrders() {
const url = `${process.env.ERP_API_URL}/production-orders?offset=${offset}&records=${records}`
const response = await request(url)
.catch(err => console.log(err))
setIsLoading(false)
if (response === undefined) { return }
console.log(response)
const body = response.body
if (!body) { return }
setActivePage((offset/records)+1)
setOrders(JSON.parse(body))
console.log(orders)
}
fetchOrders()
}, [offset])
useEffect(() => {
if (isEmpty(orders)) {return }
setTotalPages(orders[0].recordCount)
},[orders])
/* const totalPages = useMemo(() => {
console.log(`TotalPages:${orders[0].recordCount}`)
if (isEmpty(orders)) { return }
return (orders[0].recordCount)
},[orders]) */
return (
<>
<SEO title="Ürün Detay" />
{((!isLoading) & (!isEmpty(orders))) ? (
<Container>
<h1>Üretim Emirleri</h1>
<Row>
<Col>
<Table striped bordered hover size="sm">
<thead>
<tr>
<th>Tarih</th>
<th>Fiş No</th>
<th>Ürün Kodu</th>
<th>Ürün Adı</th>
<th>Varyant Kodu</th>
<th>Varyant Adı</th>
<th>Planlanan Miktar</th>
<th>Üretilen Miktar</th>
<th>Durum</th>
</tr>
</thead>
<tbody>
{orders.map(order => (
<tr key={order.prodOrderId}>
<td>{formatDate(order.createdOn)}</td>
<td>{order.prodOrderNumber}</td>
<td><Link to={`/app/item-details/${order.product[0].id}`}>{order.product[0].code}</Link></td>
<td className="text-truncate" style={{maxWidth:'90px'}}>{order.product[0].name}</td>
{order.product[0].hasOwnProperty('variantCode') ? <td>{order.product[0].variantCode}</td> : <td></td>}
{order.product[0].hasOwnProperty('variantName') ? <td className="text-truncate" style={{maxWidth:'30px'}}>{order.product[0].variantName}</td> : <td></td>}
<td>{order.plannedQuantity}</td>
<td>{order.producedQuantity}</td>
<td>{order.prodOrderStatus}</td>
</tr>
))}
</tbody>
</Table>
<BasicPagination totalPages={Math.ceil(totalPages/records)} active={activePage} callBack={handleClick} prev={handlePrev}/>
</Col>
</Row>
</Container>
)
: (!isLoading ? (<p>An error has occurred</p>) : (<p>Still Loading</p>))
}
</>
)
}
export default withAuthenticator(ProductionOrders)
import React,{useState,useffect,usemo,useCallback}来自“React”
从“盖茨比”导入{Link}
从“aws amplify react”导入{withAuthenticator,正在加载}
从“./实用程序/请求”导入请求
从“./组件/SEO”导入SEO
从“react引导/容器”导入容器
从“反应引导/行”导入行
从“反应引导/Col”导入Col
从“react引导/表”导入表
从“../utilities/formatting”导入{currLocale,formatDate}
从“../components/pagination”导入基本分页
const ProductionOrders=(道具)=>{
const[offset,setOffset]=useState(0)
让记录=20
const[orders,setOrders]=useState({})
常量[isLoading,setIsLoading]=useState(真)
常量[activePage,setActivePage]=useState(0)
const[totalPages,setTotalPages]=useState()
常数handlePrev=(e)=>{
console.log(activePage)
如果(活动页面{
e、 预防默认值()
e、 坚持
console.log(e.target.attributes.value)
const pageRequested=parseInt(e.target.attributes.value.value)
log(`pageRequested${pageRequested}`)
如果(pageRequested=='prev'){
setActivePage(activePage-1)
返回}
如果(pageRequested==activePage){return}
设置偏移量((第1页)*记录)
log(例如target.attributes.value.value)
console.log(偏移量)
}
函数isEmpty(obj){
for(obj中的var键){
if(对象hasOwnProperty(键))
返回false;
}
返回true;
}
useffect(()=>{
异步函数fetchOrders(){
const url=`${process.env.ERP\u API\u url}/生产订单?offset=${offset}&records=${records}`
const response=等待请求(url)
.catch(err=>console.log(err))
setIsLoading(错误)
if(response==未定义){return}
console.log(响应)
const body=response.body
if(!body){return}
setActivePage((偏移/记录)+1)
setOrders(JSON.parse(body))
控制台日志(订单)
}
fetchOrders()
},[offset])
useffect(()=>{
if(isEmpty(orders)){return}
setTotalPages(订单[0]。记录计数)
}[订单])
/*const totalPages=useMoom(()=>{
log(`TotalPages:${orders[0].recordCount}`)
if(isEmpty(orders)){return}
退货(订单[0]。记录计数)
}[订单])*/
返回(
{(!isLoading)&(!isEmpty(orders))(
Üretim Emirleri
塔里赫
菲诺
Ürün Kodu
Ürün Adı
瓦里安特科杜
瓦里安特酒店
普兰南米克塔尔酒店
Üretilen Miktar
硬粒
{orders.map(order=>(
{formatDate(order.createdOn)}
{order.prodOrderNumber}
{订单.产品[0].代码}
{order.product[0].name}
{order.product[0].hasOwnProperty('variantCode')?{order.product[0].variantCode}:}
{order.product[0].hasOwnProperty('variantName')?{order.product[0].variantName}:}
{order.plannedQuantity}
{订单.生产数量}
{order.prodOrderStatus}
))}
)
:(!isLoading?(发生了一个错误):(仍在加载)
}
)
}
使用验证器导出默认值(ProductionOrders)
这是分页的代码:
import React from 'React'
import { Prev } from 'react-bootstrap/esm/PageItem'
import Pagination from 'react-bootstrap/Pagination'
const BasicPagination = (props) => {
let items = []
const pages = props.totalPages
for (let i = 1; i <= props.totalPages; i++) {
items.push(
<Pagination.Item key={i} active={i === props.active} value={i} name="page" onClick={(e) => props.callBack(e)}>
{i}
</Pagination.Item>
)
}
return (
<>
<Pagination>
<Pagination.First value={1} onClick={(e) => props.callBack(e)} />
<Pagination.Prev onClick={(e) => props.prev(e)} />
{items}
<Pagination.Last value={pages} onClick={(e) => props.callBack(e)} />
</Pagination>
</>
)
}
export default BasicPagination
从“React”导入React
从'react bootstrap/esm/PageItem'导入{Prev}
从“反应引导/分页”导入分页
const BasicPagination=(道具)=>{
让项目=[]
const pages=props.totalPages
for(设i=1;i
{i}
)
}
返回(
props.callBack(e)}/>
props.prev(e)}/>
{items}
props.callBack(e)}/>
)
}
导出默认基本单位
e.target.attributes.value.value
传递事件对象onClick就是问题所在。我通过简单地传递所选的数字来解决问题,如下所示:
for (let i = 1; i <= props.totalPages; i++) {
items.push(
<Pagination.Item key={i} active={i === props.active} value={i} name="page" onClick={() => props.callBack(i)}>
{i}
</Pagination.Item>
)
}```
for(设i=1;i
{i}
)
}```
您是否能够在中复制此内容?