V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  letterLim  ›  全部回复第 1 页 / 共 2 页
回复总数  28
1  2  
3 月 20 日
回复了 letterLim 创建的主题 iDev 苹果开发者账号被封 有类似经验的吗
@finab 我的内购页里有一句 打卡 300 天后可联系客服退款 有没有可能是因为这个
2025 年 12 月 19 日
回复了 jasonchen168 创建的主题 生活 关于居住噪音,见效最快的方法
@iixy
@jasonchen168 #9 硅胶耳塞很好用 透明的那种
2025 年 8 月 27 日
回复了 zgyjking 创建的主题 酷工作 广州,招 web3 前后端开发人员(帮朋友公司内推)
没有联系方式呀
前端薪资范围多少
2025 年 7 月 24 日
回复了 ooTwToo 创建的主题 Solana [空投] 评论区抽 3 位用户空投 0.01sol
WAGMI
2025 年 6 月 24 日
回复了 zhyd1997 创建的主题 远程工作 远程工作交流群,欢迎加入👏
满了
2025 年 6 月 22 日
回复了 DanielNg23 创建的主题 远程工作 持续捞前端远程实习生
招兼职吗
2025 年 5 月 13 日
回复了 HRWeb3 创建的主题 酷工作 Web3 招前端 🔥
2025 年 4 月 12 日
回复了 Freedom2 创建的主题 买买买 大家最近买了什么好东西,有推荐的吗?
@baoshuai33 散热声音大吗
2025 年 3 月 25 日
回复了 wuhanchu 创建的主题 酷工作 厦门保沣 制造业 信息部 招 前端工程师
稳定吗
2025 年 2 月 19 日
回复了 letterLim 创建的主题 React 请教一个 react native FlatList 的问题
const getMessageList = useMemo(() => (startPage: number, endPage: number) => {
return allMessageList
.slice(startPage * PAGE_SIZE, (endPage + 1) * PAGE_SIZE)
}, [allMessageList, PAGE_SIZE])

useEffect(() => {
setMessageList(getMessageList(0, 0))
}, [])

useEffect(() => {
if (startPage === 0 && isAtBottom) {
setMessageList(getMessageList(startPage, endPage));
}
}, [startPage, endPage, getMessageList, isAtBottom]);


const onReachTop = useCallback(() => {
console.log('onReachTop');
if (isJumpingToUnread) {
return;
}
if (startPage > 0) {
const _startPage = startPage - 1;
setStartPage(_startPage);
setMessageList(getMessageList(_startPage, endPage))
}
}, [startPage, isJumpingToUnread, endPage, getMessageList]);


const onReachBottom = useCallback(() => {
console.log('onReachBottom', isJumpingToUnread);
if (isJumpingToUnread) {
return;
}
if (messageList.length < allMessageList.length) {
setEndPage(pre => {
setMessageList(getMessageList(startPage, pre + 1))
return pre + 1
})
}
}, [messageList.length, setEndPage, startPage, allMessageList.length, isJumpingToUnread, getMessageList]);

const goUnreadMessage = useCallback(() => {
setIsJumpingToUnread(true);
setUnreadNum(0)
let _messageList: any = []
const startPage = Math.floor(unreadNum / PAGE_SIZE) > 1 ? Math.floor(unreadNum / PAGE_SIZE) - 1 : 0;
let endPage = startPage + 1;
_messageList = getMessageList(startPage, endPage)
const index = _messageList.findIndex(item => item._id === lastMessageId.current)
if (index % PAGE_SIZE === 0) {
endPage = startPage + 1
}
setStartPage(startPage);
setEndPage(endPage);
setMessageList(_messageList)
}, [allMessageList.length, getMessageList]);

useEffect(() => {
if (isJumpingToUnread && lastMessageId.current) {
const index = messageList.findIndex(item => item._id === lastMessageId.current)
if (index !== -1) {
const timer = setTimeout(() => {
clearTimeout(timer)
flatListRef.current?.scrollToIndex({
index,
animated: true,
viewPosition: 0.1,
})
}, 200)
}
}
}, [messageList.length, isJumpingToUnread]);


useEffect(() => {
if (!lastMessageId.current && allMessageList.length >= (unreadNum-1) && unreadNum) {
lastMessageId.current = allMessageList[unreadNum-1]?._id;
}
}, []);

useEffect(() => {
const initMessageList = () => {
setStartPage(0)
setEndPage(0)
setMessageList(getMessageList(0, 0))
InteractionManager.runAfterInteractions(() => {
flatListRef?.current?.scrollToOffset({ offset: 0, animated: true })
})
}
EventCenter.on('init_message_list', initMessageList)
return () => {
EventCenter.remove('init_message_list', initMessageList)
}
}, [getMessageList])


const handleScroll = useCallback((event: NativeSyntheticEvent<NativeScrollEvent>) => {
const isBottom = event.nativeEvent.contentOffset.y <= 10;
setIsAtBottom(isBottom);
}, []);

const onScrollToIndexFailed = useCallback((info: {
index: number;
highestMeasuredFrameIndex: number;
averageItemLength: number;
}) => {
const offset = info.index * info.averageItemLength
flatListRef.current?.scrollToOffset({ offset: offset, animated: true })
}, []);

const threshold = isJumpingToUnread ? 0.1 : 1

<FlatList
removeClippedSubviews
windowSize={20}
onStartReachedThreshold={threshold}
onEndReachedThreshold={threshold}
onEndReached={onReachBottom}
onStartReached={onReachTop}
onScroll={handleScroll}
scrollEventThrottle={17}
keyboardDismissMode="on-drag"
maxToRenderPerBatch={10}
initialNumToRender={10}
onTouchStart={() => {
setIsMore(false)
setEmojiKeyboardVisible(false)
}}
onScrollBeginDrag={() => {
setIsJumpingToUnread(false);
}}
maintainVisibleContentPosition={startPage && !isAtBottom ? {
minIndexForVisible: 1,
autoscrollToTopThreshold: 10
}:undefined}
onScrollToIndexFailed={onScrollToIndexFailed}
inverted
contentContainerStyle={{ paddingHorizontal: 10 }}
scrollsToTop={false}
data={messageList}
keyExtractor={item => item._id}
showsVerticalScrollIndicator
ref={flatListRef}
renderItem={renderItem}
2025 年 2 月 10 日
回复了 xwartz 创建的主题 酷工作 [区块链] 去中心化钱包 imToken 招聘资深前端工程师
面试算法要求高吗
2025 年 1 月 23 日
回复了 letterLim 创建的主题 Android 请教大佬们一个安卓打包 keystore 的问题
找到了 是 rn 自带的 debug.keystore.. 一直使用这个 keystore 打包会有问题吗
2025 年 1 月 23 日
回复了 letterLim 创建的主题 Android 请教大佬们一个安卓打包 keystore 的问题
还有一个问题 , 为什么我们几个不同的同事打包应用, 用户都能够正常更新呢? 如果我用的是 debug.keystore, 那别的同事打包出来的 apk 不应该是他们电脑的 bebug.keystore 吗
2024 年 4 月 10 日
回复了 letterLim 创建的主题 求职 前端应届生找工作 大佬们可以帮忙看看简历吗!
@haimianbihdata 主要是 web3 的东西 不敢分的太细啊哈哈哈哈
2024 年 4 月 10 日
回复了 letterLim 创建的主题 求职 前端应届生找工作 大佬们可以帮忙看看简历吗!
@haimianbihdata 项目在工作经历里
2024 年 3 月 8 日
回复了 philoveritas 创建的主题 MacBook Pro 14inch MBP 选择 M1 Max 64G 2T 还是 M3 Max 14C 36G 1T?
m3max 比 m1max 便宜三千? 哪个渠道
1  2  
关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1069 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 36ms · UTC 22:56 · PVG 06:56 · LAX 15:56 · JFK 18:56
♥ Do have faith in what you're doing.