สำรวจ 10 Vue.js ที่จำเป็น Composables สำหรับโปรเจ็กต์ของคุณ

ในโปรเจ็กต์ Vue.js composables เป็นฟังก์ชันที่ใช้ในการนำตรรกะและสถานะกลับมาใช้ใหม่ระหว่างส่วนประกอบต่างๆ นี่คือ Vue.js ยอดนิยมบางส่วน composables ที่คุณสามารถใช้ในโครงการของคุณ:

useLocalStorage และ useSessionStorage

สิ่งเหล่านี้ composables ช่วยให้คุณจัดเก็บและจัดการข้อมูลในเครื่อง storage หรือ session storage ในเบราว์เซอร์

<template>  
  <div>  
    <p>Last visited: {{ lastVisited }}</p>  
  </div>  
</template>  
  
<script>  
import { useLocalStorage } from '@vueuse/core';  
  
export default {  
  setup() {  
    const lastVisited = useLocalStorage('last_visited', new Date());  
  
    return {  
      lastVisited,  
    };  
  },  
};  
</script>  

useDebounce และ useThrottle

สิ่งเหล่านี้ composables ทำให้คุณสามารถใช้ debounce หรือ throttle กับฟังก์ชันการจัดการเหตุการณ์ ซึ่งช่วยควบคุมความถี่ของการดำเนินการ

<template>  
  <div>  
    <input v-model="searchQuery" @input="handleSearch" />  
    <p>Search results: {{ searchResults }}</p>  
  </div>  
</template>  
  
<script>  
import { ref } from 'vue';  
import { useDebounce } from '@vueuse/core';  
  
export default {  
  setup() {  
    const searchQuery = ref('');  
    const searchResults = ref([]);  
  
    const handleSearch = useDebounce(() => {  
      // Perform search based on searchQuery  
      // Update searchResults  
    }, 300);  
  
    return {  
      searchQuery,  
      searchResults,  
      handleSearch,  
    };  
  },  
};  
</script>  

useMediaQueries

สิ่งนี้ composable ช่วยให้คุณติดตามการสืบค้นสื่อเพื่อดำเนินการตอบสนองตามขนาดหน้าจอ

<template>  
  <div>  
    <p>Current screen size: {{ screenSize }}</p>  
  </div>  
</template>  
  
<script>  
import { useMediaQueries } from '@vueuse/core';  
  
export default {  
  setup() {  
    const { screenSize } = useMediaQueries({  
      mobile: 'screen and(max-width: 640px)',  
      tablet: 'screen and(max-width: 1024px)',  
      desktop: 'screen and(min-width: 1025px)',  
    });  
  
    return {  
      screenSize,  
    };  
  },  
};  
</script>  

useAsync

สิ่งนี้ composable ช่วยให้คุณจัดการงานอะซิงโครนัสและตรวจสอบสถานะ(รอดำเนินการ สำเร็จ ข้อผิดพลาด)

<template>  
  <div>  
    <button @click="fetchData">Fetch Data</button>  
    <p v-if="status === 'pending'">Loading...</p>  
    <p v-if="status === 'success'">Data loaded: {{ data }}</p>  
    <p v-if="status === 'error'">Error loading data.</p>  
  </div>  
</template>  
  
<script>  
import { ref } from 'vue';  
import { useAsync } from '@vueuse/core';  
  
export default {  
  setup() {  
    const fetchData = async() => {  
      // Simulate fetching data  
      const response = await fetch('https://api.example.com/data');  
      const data = await response.json();  
      return data;  
    };  
  
    const { execute, value: data, status } = useAsync(fetchData);  
  
    return {  
      fetchData: execute,  
      data,  
      status,  
    };  
  },  
};  
</script>  

useEventListener

ซึ่ง composable จะช่วยให้คุณติดตามเหตุการณ์ในองค์ประกอบ DOM และดำเนินการที่เกี่ยวข้อง

<template>  
  <div>  
    <p>Mouse position: {{ mouseX }}, {{ mouseY }}</p>  
  </div>  
</template>  
  
<script>  
import { ref } from 'vue';  
import { useEventListener } from '@vueuse/core';  
  
export default {  
  setup() {  
    const mouseX = ref(0);  
    const mouseY = ref(0);  
  
    useEventListener('mousemove',(event) => {  
      mouseX.value = event.clientX;  
      mouseY.value = event.clientY;  
    });  
  
    return {  
      mouseX,  
      mouseY,  
    };  
  },  
};  
</script>  

useRouter

ซึ่ง composable ช่วยให้คุณเข้าถึง router ข้อมูลและพารามิเตอร์การสืบค้น URL ใน Vue Router แอปพลิเคชัน

<template>  
  <div>  
    <p>Current route: {{ currentRoute }}</p>  
  </div>  
</template>  
  
<script>  
import { useRoute } from 'vue-router';  
  
export default {  
  setup() {  
    const route = useRoute();  
    const currentRoute = route.fullPath;  
  
    return {  
      currentRoute,  
    };  
  },  
};  
</script>  

usePagination

ซึ่ง composable ช่วยให้คุณจัดการการแสดงข้อมูลแบบแบ่งหน้าและการดำเนินการนำทาง

<template>  
  <div>  
    <ul>  
      <li v-for="item in currentPageData":key="item.id">{{ item.name }}</li>  
    </ul>  
    <button @click="previousPage":disabled="currentPage === 1">Previous</button>  
    <button @click="nextPage":disabled="currentPage === totalPages">Next</button>  
  </div>  
</template>  
  
<script>  
import { ref, computed } from 'vue';  
import { usePagination } from '@vueuse/core';  
  
export default {  
  setup() {  
    const data = ref([...]); // Paginated data  
    const itemsPerPage = 10;  
    const currentPage = ref(1);  
  
    const { currentPageData, nextPage, previousPage, totalPages } = usePagination(data, itemsPerPage, currentPage);  
  
    return {  
      currentPageData,  
      nextPage,  
      previousPage,  
      currentPage,  
      totalPages,  
    };  
  },  
};  
</script>  

useIntersectionObserver

ซึ่ง composable จะช่วยให้คุณติดตามจุดตัดขององค์ประกอบด้วย ซึ่ง viewport มีประโยชน์สำหรับการดำเนินการเมื่อองค์ประกอบปรากฏให้เห็นหรือหายไป

<template>  
  <div>  
    <div ref="observedElement">Observed Element</div>  
    <p v-if="isIntersecting">Element is intersecting!</p>  
  </div>  
</template>  
  
<script>  
import { ref } from 'vue';  
import { useIntersectionObserver } from '@vueuse/core';  
  
export default {  
  setup() {  
    const observedElement = ref(null);  
    const { isIntersecting } = useIntersectionObserver(observedElement, {});  
  
    return {  
      observedElement,  
      isIntersecting,  
    };  
  },  
};  
</script>  

useClipboard

ซึ่ง composable จะช่วยให้คุณคัดลอกข้อมูลไปยัง clipboard และจัดการสถานะการคัดลอกได้

<template>  
  <div>  
    <p>Text to copy: {{ textToCopy }}</p>  
    <button @click="copyText">Copy Text</button>  
    <p v-if="copied">Copied to clipboard!</p>  
  </div>  
</template>  
  
<script>  
import { ref } from 'vue';  
import { useClipboard } from '@vueuse/core';  
  
export default {  
  setup() {  
    const textToCopy = ref('Hello, Vue.js!');  
    const { copy, copied } = useClipboard();  
  
    const copyText =() => {  
      copy(textToCopy.value);  
    };  
  
    return {  
      textToCopy,  
      copyText,  
      copied,  
    };  
  },  
};  
</script>  

useRouteQuery

ซึ่ง composable ช่วยให้คุณจัดการสถานะการสืบค้น URL และอัปเดตเนื้อหาของเพจตามการสืบค้น URL

<template>  
  <div>  
    <input v-model="searchQuery" />  
    <button @click="updateQuery">Search</button>  
    <p>Search results: {{ searchResults }}</p>  
  </div>  
</template>  
  
<script>  
import { ref } from 'vue';  
import { useRouter, useRouteQuery } from '@vueuse/core';  
  
export default {  
  setup() {  
    const router = useRouter();  
    const searchQuery = ref('');  
    const { search } = useRouteQuery();  
    const searchResults = ref([]);  
  
    const updateQuery =() => {  
      router.push({ query: { search: searchQuery.value } });  
      // Perform search based on searchQuery and update searchResults  
    };  
  
    return {  
      searchQuery,  
      searchResults,  
      updateQuery,  
    };  
  },  
};  
</script>  

โปรดทราบว่าหากต้องการใช้สิ่งเหล่านี้ composables คุณจะต้องติดตั้ง @vueuse/core ไลบรารีโดยใช้ npm หรือเส้นด้าย สิ่งเหล่านี้ composables ช่วยให้คุณนำตรรกะและสถานะทั่วไปมาใช้ซ้ำในโปรเจ็กต์ Vue.js ของคุณ เพิ่มประสิทธิภาพกระบวนการพัฒนาและการจัดการโค้ด