【发布时间】:2019-11-27 17:10:22
【问题描述】:
我无法理解 React 更新 DOM 的确切时间。
注意:我在下面的示例中使用styled-components。
看这个例子:
代码沙盒:https://codesandbox.io/s/elegant-dirac-j6e54
它显示了容器的max-height 属性的转换。
它按预期工作。我只是不知道为什么它有效。
代码:
两个列表:
-
shortList需要高度的70px -
longList需要高度的124px
const shortList = ["Item 1", "Item 2", "Item 3"];
const longList = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6"];
我有一个名为ListContainerDIV 的styled-component 容器,它将根据props 处理转换。道具名称为idealHeight。
const ListContainerDIV = styled.div`
overflow: hidden;
max-height: ${props => props.idealHeight + "px"};
transition: max-height ease-out .5s;
`;
应用组件
function App() {
// STATE TO KEEP LIST AND REF FOR THE CONTAINER DIV ELEMENT
const [list, setList] = useState(shortList);
const containerDiv_Ref = useRef(null);
// FUNCTION TO TOGGLE BETWEEN LISTS FROM BUTTON CLICK
function changeList() {
setList(prevState => {
if (prevState.length === 3) {
return longList;
} else {
return shortList;
}
});
}
// CALCULATING THE IDEALHEIGHT DURING THE RENDER
let idealHeight = null;
if (list.length === 3) {
idealHeight = 70;
} else if (list.length === 6) {
idealHeight = 124;
}
// RETURNING THE LISTCONTAINER WITH THE `idealHeight` PROP
return (
<React.Fragment>
<button onClick={changeList}>Change List</button>
<ListContainerDIV ref={containerDiv_Ref} idealHeight={idealHeight}>
<ListComponent list={list} />
</ListContainerDIV>
</React.Fragment>
);
}
列表组件
这是一个渲染<ul>和<li>'s的简单组件
function ListComponent(props) {
const listItems = props.list.map(item => <li key={item}>{item}</li>);
return <ul>{listItems}</ul>;
}
问题
如果我在呈现列表之前就设置了组件的max-height,这种转换如何工作?我的意思是,idealHeight 是在 App 渲染期间设置的。我在想 longList 将在一个已经有 max-height = 124 的容器中呈现?如果发生这种情况,我们就不会看到过渡,对吧?
React 在这种情况下运行的事件顺序是什么?
显然它会先更新<ul> 和<li>'s,然后再从styled-component 容器更新div。
内部组件的元素总是在外部组件的元素之前更新?
更新
刚刚发现 Dan Abramov 关于这个主题的这些推文:
【问题讨论】:
标签: javascript reactjs react-hooks styled-components