- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 React 组件有这个问题,我无法弄清楚。每次重新渲染时它都会滚动回顶部。而且,我无法弄清楚为什么它首先要重新渲染。基本上我有一个祖 parent , parent 和孙子组件。孙子有一个点击事件,显示祖 parent 的另一个 child ,如果这有任何意义的话。该 click 事件做了一些事情,但它会导致祖父组件的重新渲染,从而导致父组件滚动到顶部。我将添加我的代码,希望能澄清我在这里所说的内容。只是想提供一些背景信息。
所以主要问题是滚动到顶部。如果我们能弄清楚它为什么要重新渲染并停止它,那就太好了。
祖 parent (StaticLine.js):
import React, { useEffect, useState } from 'react';
import StaticOrderColumn from '../ordercolumn/StaticOrderColumn';
import { useGlobalLineTypeActionsContext } from '../../context/GlobalLineTypeContext';
import Details from '../details/DetailsColumn';
import { ModalStyles } from '../modals/ModalStyles';
import {
useScheduleActionsContext,
useScheduleContext
} from '../../context/ScheduleContext';
import PalletCount from './PalletCount';
import OrderButtons from './OrderButtons';
import PropTypes from 'prop-types';
import {
useGlobalShowDetailsActionsContext,
useGlobalShowDetailsContext
} from '../../context/GlobalShowDetailsContext';
import { useTraceUpdate } from '../../utils/hooks';
const StaticLine = (props) => {
useTraceUpdate(props);
console.log('top of StaticLine');
const { type, setTitle } = props;
const { orderType, orders } = useScheduleContext();
const { setOrders, setOrderType } = useScheduleActionsContext();
const setGlobalLineType = useGlobalLineTypeActionsContext();
const showDetails = useGlobalShowDetailsContext();
const setShowDetails = useGlobalShowDetailsActionsContext();
const [lineID, setLineID] = useState(-1);
const [lineTitle, setLineTitle] = useState('');
const [highlightDest, setHighlightDest] = useState(false);
const ordersCol = React.useRef();
let lineCountOffset = 0;
let numLines = 4;
let pageTitle = '';
switch (type) {
case 'bagline':
pageTitle += 'Bag Lines';
break;
case 'toteline':
pageTitle += 'Tote Lines';
lineCountOffset = 10;
break;
case 'otherline':
pageTitle += 'Other Lines';
numLines = 3;
lineCountOffset = 4;
break;
default:
}
useEffect(() => {
setLineID(-1);
}, [type]);
const globalLineType = type + 's';
useEffect(() => {
setGlobalLineType(globalLineType);
setTitle(pageTitle);
const title = `${process.env.REACT_APP_BASE_TITLE ||
'title'} - ${pageTitle}`;
document.title = title;
}, [type, setGlobalLineType, pageTitle, setTitle, globalLineType]);
const selectLine = (e) => {
setShowDetails(false);
setHighlightDest(false);
const lineNum = e.target.value.substring(4);
setLineID(parseInt(lineNum, 10));
setLineTitle(
orderType.charAt(0).toUpperCase() +
orderType.slice(1) +
' Orders - Line ' +
parseInt(lineNum, 10)
);
};
const selectOrderType = (e) => {
const selectedOrderType = e.target.value;
setOrderType(selectedOrderType);
setShowDetails(false);
setLineTitle(
selectedOrderType.charAt(0).toUpperCase() +
selectedOrderType.slice(1) +
' Orders - Line ' +
lineID
);
};
const OrderColWithRef = React.forwardRef((props, ref) => (
<StaticOrderColumn
{...props}
title={lineTitle}
lineID={lineID}
orders={orders}
ref={ref}
/>
));
return (
<div
className={`staticLines p-1 no-gutters d-flex flex-nowrap${
orderType === 'completed' ? ' completed' : ''
}`}
>
<div className={'radio-col no-border'}>
<div className={'radio-container p-2'}>
<div className={'radios'}>
// lots of irrelevant code here
</div>
</div>
</div>
{lineID > -1 && (
<>
<div
className={'col lines no-gutters order-col'}
>
<OrderColWithRef ref={ordersCol} />
</div>
<div className={'col row lines no-gutters order-details'}>
<Details
setOrders={setOrders}
orders={orders || []}
customStyles={ModalStyles}
highlightDest={highlightDest}
setHighlightDest={setHighlightDest}
errLocation={'top-center'}
/>
{orderType === 'completed' && showDetails && (
<OrderButtons
setLineID={setLineID}
setOrders={setOrders}
orders
lineNum={lineID}
/>
)}
</div>
<div className={'col lines no-gutters d-flex no-border'}>
{orderType === 'scheduled' && (
<PalletCount
type={'Bag'}
lineNum={lineID}
orders={orders}
setTitle={setTitle}
setHighlightDest={setHighlightDest}
/>
)}
</div>
</>
)}
</div>
);
};
StaticLine.propTypes = {
type: PropTypes.string.isRequired,
orders: PropTypes.array,
setTitle: PropTypes.func.isRequired
};
export default StaticLine;
父(StaticOrderColumn.js):
import React from 'react';
import PropTypes from 'prop-types';
import StaticOrder from '../order/StaticOrder';
import '../../scss/App.scss';
import { useGlobalSpinnerContext } from '../../context/GlobalSpinnerContext';
const StaticOrderColumn = (props) => {
const { title, lineID, orders } = props;
const isGlobalSpinnerOn = useGlobalSpinnerContext();
const sortedOrdersIDs = orders
.filter((o) => o.lineNum === lineID)
.sort((a, b) => a.linePosition - b.linePosition)
.map((o) => o.id);
return (
<div id={'line-0'} className={'col order-column'}>
<header className={'text-center title'}>
{title}{' '}
{sortedOrdersIDs.length > 0 && (
<span> ({sortedOrdersIDs.length})</span>
)}
</header>
<div className={'orders'}>
{orders &&
sortedOrdersIDs &&
sortedOrdersIDs.map((orderID, index) => {
const order = orders.find((o) => o.id === orderID);
return (
<StaticOrder
key={orderID}
order={order}
index={index}
/>
);
})}
{!sortedOrdersIDs.length && !isGlobalSpinnerOn && (
<h3>There are no orders on this line.</h3>
)}
</div>
</div>
);
};
StaticOrderColumn.propTypes = {
title: PropTypes.string.isRequired,
lineID: PropTypes.number.isRequired,
orders: PropTypes.array.isRequired,
ref: PropTypes.instanceOf(Element).isRequired
};
export default StaticOrderColumn;
这个文件是点击事件发生的地方,它会导致重新渲染 StaticLine 并滚动到顶部以获取 StaticOrderColumn。
import React from 'react';
import styled from 'styled-components';
import PropTypes from 'prop-types';
import '../../scss/App.scss';
import { getFormattedDate } from '../../utils/utils';
import { useGlobalActiveOrderActionsContext } from '../../context/GlobalActiveOrderContext';
import { useGlobalShowDetailsActionsContext } from '../../context/GlobalShowDetailsContext';
// import { stringTrunc } from '../../utils/utils';
const MyOrder = styled.div`
background-color: #193df4;
transition: background-color 1s ease;
`;
const devMode = true;
// const devMode = false;
const StaticOrder = (props) => {
const {
id,
item,
desc,
cust,
palletsOrd,
bagID,
chemicals,
totalBagsUsed,
linePosition,
palletsRem,
palletCount,
requestDate,
orderNumber,
comments
} = props.order;
const setActiveOrder = useGlobalActiveOrderActionsContext();
const setShowDetails = useGlobalShowDetailsActionsContext();
const orderID = id + '';
// show the details section when user clicks an order
// THIS IS WHERE THE ISSUE IS HAPPENING, WHEN THE ORDER IS CLICKED,
// THIS FUNCTION RUNS AND THE StaticLine COMPONENT RE-RENDERS AND THE StaticOrderColumn SCROLLS TO THE TOP
const showDetails = (orderID) => {
setActiveOrder(parseInt(orderID, 10));
setShowDetails(true);
};
return (
<MyOrder
id={orderNumber}
className={'order static'}
onClick={(e) => showDetails(orderID, e)}
>
{/*<div className={'orderID'}>{id}</div>*/}
<p className={'item-number'}>
{item !== '' ? `Item Number: ${item}` : ''}
</p>
<p>{desc !== '' ? `NPK: ${desc}` : ''}</p>
<p>{cust !== '' ? `Customer: ${cust}` : ''}</p>
<p>
{palletsOrd !== '' ? `Pallets Ordered: ${palletsOrd}` : ''}
</p>
<p>{bagID !== '' ? `Bag ID: ${bagID}` : ''}</p>
<p>{chemicals !== '' ? `Chemical : ${chemicals}` : ''}</p>
<p>
{requestDate !== ''
? `Request Date: ${getFormattedDate(new Date(requestDate))}`
: ''}
</p>
{devMode && (
<>
<div className={'id-line-num-pos'}>
<p>OrderID: {orderNumber}</p>
</div>
</>
)}
<div className={'total-bags'}>Total Bags: {totalBagsUsed}</div>
<div className={'pallets-remaining'}>
Pallets Left: {palletsRem}
</div>
<div className={'pallets-done'}>
Pallets Done: {palletCount}
</div>
<div className={'line-position'}>{linePosition + 1}</div>
{comments.length > 0 && (
// bunch of SVG code
)}
</MyOrder>
);
};
StaticOrder.propTypes = {
order: PropTypes.object,
id: PropTypes.number,
index: PropTypes.number,
title: PropTypes.string,
orderID: PropTypes.string
};
export default StaticOrder;
编辑:我正在添加问题的图片,以帮助大家也将其形象化。订单框位于此图像的左侧。默认情况下,“订单详细信息”是隐藏的。单击左侧的订单时,它会将订单加载到订单详细信息中并显示该组件。发生这种情况时,左侧的订单列会滚动回顶部。在后续订单点击时,它不会滚动到顶部。只有当它显示或隐藏“订单详细信息”时,它才会滚动回顶部。
const showDetails = useGlobalShowDetailsContext();
行和对
showDetails
的 2 个引用在StaticLine.js 之外,这个问题就消失了。因此,如果这有助于任何人弄清楚...
showDetails
的引用之一在
StaticLine.js
文件。现在,如果有人能帮我弄清楚如何从该组件中获取最后一个引用,但保留功能,那将是惊人的!!
{orderType === 'completed' && showDetails && (
<OrderButtons
setLineID={setLineID}
setOrders={setOrders}
orders
lineNum={lineID}
/>
)}
如果需要更多信息或更多代码,请告诉我。任何见解将不胜感激。
最佳答案
const OrderColWithRef = React.forwardRef((props, ref) => (
<StaticOrderColumn
{...props}
title={lineTitle}
lineID={lineID}
orders={orders}
ref={ref}
/>
));
将此移到
StaticLine
之外作为顶级功能。
element.type
来完成的。 .
OrderColWithRef
每个渲染上的函数,因为它是一个局部函数,所以类型不相等。每次在
StaticLine
中发生任何事情时,React 都会卸载并重新装载一个新的 html 元素。变化。
关于reactjs - React 组件在重新渲染时滚动回顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63957480/
问题是,当用户回复彼此的帖子时,我必须这样做: margin-left:40px; 对于 1 级深度 react margin-left:80px; 对于 2 层深等 但是我想让 react div
我试图弄清楚如何将 React Router 与 React VR 连接起来。 首先,我应该使用 react-router dom/native ?目前尚不清楚,因为 React VR 构建在 Rea
我是 React 或一般编码背景的新手。我不确定这些陈述之间有什么区别 import * as react from 'react' 和 import react from 'react' 提前致谢!
我正在使用最新的稳定版本的 react、react-native、react-test-renderer、react-dom。 然而,react-native 依赖于 react@16.0.0-alp
是否 react 原生 应用程序开发可以通过软件架构实现,例如 MVC、MVP、MVVM ? 谢谢你。 最佳答案 是的。 React Native 只是你提到的那些软件设计模式中的“V”。如果你考虑其
您好我正在尝试在我的导航器右按钮中绑定(bind)一个功能, 但它给出了错误。 这是我的代码: import React, { Component } from 'react'; import Ico
我使用react native创建了一个应用程序,我正在尝试生成apk。在http://facebook.github.io/react-native/docs/signed-apk-android.
1 [我尝试将分页的 z-index 更改为 0,但没有成功] 这是我的codesandbox的链接:请检查最后一个选择下拉列表,它位于分页后面。 https://codesandbox.io/s/j
我注意到 React 可以这样导入: import * as React from 'react'; ...或者像这样: import React from 'react'; 第一个导入 react
我是 react-native 的新手。我正在使用 React Native Paper 为所有屏幕提供主题。我也在使用 react 导航堆栈导航器和抽屉导航器。首先,对于导航,论文主题在导航组件中不
我有一个使用 Ignite CLI 创建的 React Native 应用程序.我正在尝试将 TabNavigator 与 React Navigation 结合使用,但我似乎无法弄清楚如何将数据从一
我正在尝试在我的 React 应用程序中进行快照测试。我已经在使用 react-testing-library 进行一般的单元测试。然而,对于快照测试,我在网上看到了不同的方法,要么使用 react-
我正在使用 react-native 构建跨平台 native 应用程序,并使用 react-navigation 在屏幕之间导航和使用 redux 管理导航状态。当我嵌套导航器时会出现问题。 例如,
由于分页和 React Native Navigation,我面临着一种复杂的问题。 单击具有类别列表的抽屉,它们都将转到屏幕 问题陈述: 当我随机点击类别时,一切正常。但是,在分页过程中遇到问题。假
这是我的抽屉导航: const DashboardStack = StackNavigator({ Dashboard: { screen: Dashboard
尝试构建 react-native android 应用程序但出现以下错误 info Running jetifier to migrate libraries to AndroidX. You ca
我目前正在一个应用程序中实现 React Router v.4,我也在其中使用 Webpack 进行捆绑。在我的 webpack 配置中,我将 React、ReactDOM 和 React-route
我正在使用 React.children 渲染一些带有 react router 的子路由(对于某个主路由下的所有子路由。 这对我来说一直很好,但是我之前正在解构传递给 children 的 Prop
当我运行 React 应用程序时,它显示 export 'React'(导入为 'React')在 'react' 中找不到。所有页面错误 see image here . 最佳答案 根据图像中的错误
当我使用这个例子在我的应用程序上实现 Image-slider 时,我遇到了这个错误。 import React,{Component} from 'react' import {View,T
我是一名优秀的程序员,十分优秀!