Я использую API для получения последних сообщений из Firestore. API выглядит примерно так:
function loadFeedPosts(
createdAtMax,
limit
) {
return db
.collection("posts")
.orderBy("createdAt", "desc")
.where("createdAt", "<", createdAtMax)
.limit(limit)
.get()
.then(getDocsFromSnapshot)
}
createdAtMax
- это время, которое нам нужно указать для получения сообщений.
А у меня есть компонент Feed
. Это выглядит так.
function Feed() {
const [posts, setPosts] = useState([])
const [currentTime, setCurrentTime] = useState(Date.now())
const [limit, setLimit] = useState(3)
useEffect(() => {
loadFeedPosts(currentTime, limit).then(posts => {
setPosts(posts)
})
}, [currentTime, limit])
return (
<div className="Feed">
<div className="Feed_button_wrapper">
<button className="Feed_new_posts_button icon_button">
View 3 New Posts
</button>
</div>
{posts.map(post => (
<FeedPost post={post} />
))}
<div className="Feed_button_wrapper">
<button
className="Feed_new_posts_button icon_button"
onClick={() => {
setLimit(limit + 3)
}}
>
View More
</button>
</div>
</div>
)
}
Итак, когда люди нажимают кнопку View More
, он go получит еще 3 сообщения.
Мой вопрос в том, что, поскольку нажатие на кнопку View More
запускает повторный рендеринг, я предполагаю, что строка const [currentTime, setCurrentTime] = useState(Date.now())
будет запущена снова, делает ли Date.now()
, которое служит начальным значением для currentTime
снова оценивать каждый повторный рендеринг?
Я тестировал это сам, выйдя из системы currentTime
, и казалось, что не обновляется для каждого рендера. Согласно React do c https://reactjs.org/docs/hooks-reference.html#lazy -initial-state , я думал, что только при использовании начального состояния Lazy initialState
вычисляется только один раз. Но здесь я не использую ленивое начальное состояние, почему оно не вычисляется каждый раз при повторном рендеринге компонента?
Хотя предполагаемое поведение начального состояния currentTime
точно остается таким же для каждого повторного рендеринга я просто сбит с толку, почему он не пересчитывался для каждого повторного рендеринга, поскольку я не использую ленивое начальное состояние