iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Mobile Development

即使明天老闆突然叫你用 React Native 也可以跟他說好沒問題系列 第 20

Day 20. 從實作 onTop 按鈕,認識 useRef 與 scrollTo

  • 分享至 

  • xImage
  •  

內容很多的網站,時常會在右下角設計一個 onTop 按鈕。那要如何在 App 中達成,「按下某個按鈕,就滑到特定區塊」這種功能呢?
https://ithelp.ithome.com.tw/upload/images/20230923/20129635CRgaFH2UOx.png

首先,來拆解一下功能。我們需要一個能滑到特定區域的指令,也需要取得特定區域的資料。

過往沒有使用框架時,開發者要操控網頁 DOM ,會透過綁定 id ,再以 document.querySelectordocument.getElementById 取得元素後,進行後續處理。而 React 提供一個 useRef 的 Hook ,讓我捫能直接以 ref 綁定要操控的元素。換句話說,在上述功能中我們需綁定要滑動的區塊。綁定方式很簡單,給 ref 一個名稱,以 useRef() 初始化,再到要綁定的元件以 ref={refName} 綁定即可。注意! ref 就像 id 一樣,是不能重複的。

import {useRef} from 'react';
function HomeScreen() {
  const scrollRef = useRef();
  return (
    <View>
      <ScrollView ref={scrollRef} style={styles.container}>
        <Text>
LoremLore… 省略
        </Text>
      </ScrollView>
      <TouchableOpacity onPress={onPressTouch} style={styles.btn}>
        <Text>to top</Text>
      </TouchableOpacity>
    </View>
);
}

const styles = StyleSheet.create({
  container: {
    backgroundColor: '#999',
    height: hp('50%'),
    paddingHorizontal: 25,
    marginBottom: 20,
  },
  btn: {
    backgroundColor: 'cyan',
    alignItems: 'center',
    paddingVertical: 5,
  },
});

透過 console.log() 觀察 scrollRef ,會發現他是個包了許多資料與方法的物件,讓我們能操控元素。其中,有一個方法叫 scrollTo ,顧名思義是讓元素滑動到特定位置的方法。
https://ithelp.ithome.com.tw/upload/images/20230923/20129635OURzsFBrlU.png

scrollTo 可以傳入 x 和 y 軸的位置,也可以藉由調整 animated 的布林值,讓滑動的方式以較滑順的動畫來呈現。預設是 true ,調為 false 則會直接跳到指定位置,不會慢慢上滑或下滑。

const onPressTouch = () => {
  scrollRef.current?.scrollTo({
    y: 0,
    animated: true,
  });
};

如此一來,我們就完成一個簡易的 toTop 按鈕。

useRef 還有另一個特性,當把值存在裡頭時,即使值被更新也不會觸發重新渲染。因此除了可以用來操控 DOM 外,也可以用這些特性阻止無限迴圈,或取得過去的值。關於 useRef() 詳細介紹,可以參考這篇 [誰來跟我 React 一下] useRef


上一篇
Day 19. 從實作跑馬燈,認識 Animated
下一篇
Day 21. 從實作抽屜,認識 onContentSizeChange
系列文
即使明天老闆突然叫你用 React Native 也可以跟他說好沒問題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言