Vue jsx를 사용한 동적 레이아웃: 유연하고 유지 관리 가능한 UI 가이드
作者 Dubem Izuorah
您是否曾经花费数小时跨多个页面调整相同的网页布局,或者努力让您的 UI 适应不断变化的数据而不造成破坏?这些常见的挑战可能会减慢您的开发过程,并导致令人沮丧且容易出错的代码。
引入动态布局
通过在运行时基于数据创建布局,您可以构建灵活、可维护和可扩展的应用程序,轻松适应变化。这种方法称为 动态布局,消除了重复 HTML 编辑的需要,使您的 UI 与数据无缝保持同步。
在本文中,我们将探讨动态布局如何改变您的开发工作流程并提升您的项目。
为什么使用动态布局?
当内容频繁更改或显示从 API、其他数据源提取的响应式 UI 或响应用户交互时,动态布局特别有用。
动态布局的好处
- 灵活性:基于底层数据轻松调整UI组件,无需修改HTML或模板代码。
- 可维护性:坚持DRY(Don’t Repeat Yourself)原则,减少重复代码,简化维护。
- 可扩展性:以编程方式管理您的 UI,允许轻松更新、添加或删除项目。
- 减少错误:最大限度地减少手动 HTML 编辑,降低出现错误的可能性。
- 增强响应能力:根据条件动态显示或隐藏 UI 元素,使界面对用户交互或数据变化的响应更加灵敏。
动态布局的实际场景
动态布局在各种现实场景中大放异彩,例如:
- 表单:对于表单较多的应用程序,最好将表单字段抽象为与某些验证库配对的计算属性。在布局中,您可以循环遍历属性以有条件地显示表单字段和属性,例如标签、类名称、验证消息等。
- 博客文章列表:根据数据动态管理和更新每张明信片的内容。
- 内容块:有效组织和显示不同的内容元素。
- 用户列表、导航项、仪表板:确保一致的样式和轻松调整,无需手动 HTML 更新。
- 网站部分:动态生成部分以保持有凝聚力且易于调整的布局。
通过动态生成这些元素,您可以确保一致性、简化调整并维护干净的代码库。
构建动态导航栏
让我们通过构建动态导航栏来获得动态布局的实践经验。作为参考,这里是本教程的 Github 存储库。
要求
假设您正在开发一个支付平台,需要创建一个干净的、可扩展的导航栏组件,如下面的屏幕截图所示:
用户登录时的导航栏
没有用户登录的导航栏
设置环境
为了专注于动态布局,我们不会在这里深入研究环境设置细节。您可以在我们的 GitHub 存储库中找到完整的代码示例。
使用的技术:
- Nuxt — Vue框架
- Nuxt TailwindCSS — 样式
- Phosphor-icons Vue — 图标组件
静态方法
静态导航栏组件涉及大量 HTML 标签和属性,使得代码难以阅读和维护。
更新此类布局很容易出错,尤其是在重复元素共享相同属性或样式的情况下。
虽然静态方法对于起草布局很有用,但动态布局对于可维护性和协作来说更可取。
静态导航栏示例:
? App.vue
<template> <nav class="w-screen border-b py-4"> <div class="container mx-auto flex items-center gap-10"> <!-- Logo --> <NuxtLink href="/" class="flex items-center"> <img src="https://logo.clearbit.com/google.com" class="w-10 h-10 object-contain" /> </NuxtLink> <!-- Dashboard or Home Link --> <NuxtLink v-if="user" href="/dashboard" class="flex items-center"> <PhGauge size="24" /> <span class="ml-2">Dashboard</span> </NuxtLink> <NuxtLink v-else href="/home" class="flex items-center"> <PhHouseSimple size="24" /> <span class="ml-2">Home</span> </NuxtLink> <!-- Spacer --> <div class="ml-auto"></div> <!-- Add Funds Button (Visible only when user is authenticated) --> <button v-if="user" class="flex items-center"> <span class="text-white bg-green-500 px-4 py-2 rounded-lg">Add Funds</span> </button> <!-- User Avatar (Visible only when user is authenticated) --> <div v-if="user" class="flex items-center"> <Avatar src="https://randomuser.me/api/portraits/men/40.jpg" /> <span class="ml-2">Dubem Izuorah</span> </div> <!-- Auth Button --> <button class="flex items-center" @click="user = !user"> <span>{{ user ? 'Logout' : 'Login' }}</span> </button> </div> </nav> <main class="h-64 bg-gray-100 flex justify-center pt-10 text-xl">App Here</main> </template> <script setup lang="jsx"> import { ref } from "vue"; import { NuxtLink, Avatar } from "#components"; import { PhGauge, PhHouseSimple } from "@phosphor-icons/vue"; // Simulate user authentication status const user = ref(true); </script>
虽然静态布局可能足以满足简单的界面,但动态布局提供了卓越的可维护性和可扩展性。
Dynamic Approach
To create a dynamic navbar, we’ll want to define our layout data and generate UI components based on this data.
Defining the Data
Instead of hard-coding each menu item, we can create a list of menu items in our script with properties like title, image, to, icon, render, and class. This allows us to dynamically generate the navbar based on the data.
? App.vue
<script setup lang="jsx"> // Import necessary components import { ref, computed } from "vue"; import { NuxtLink, Avatar } from "#components"; import { PhGauge, PhHouseSimple } from "@phosphor-icons/vue"; // Simulate user authentication status const user = ref(true); // Define menu items const items = computed(() => [ { key: "logo", image: "https://logo.clearbit.com/google.com", href: "/" }, { icon: user.value ? PhGauge : PhHouseSimple, key: "dashboard", title: user.value ? "Dashboard" : "Home", to: user.value ? "/dashboard" : "/home", }, { key: "spacer", class: "ml-auto", }, { key: "add-funds", render: () => <span class="text-white bg-green-500 px-4 py-2 rounded-lg">Add Funds</span> }, { key: "user", render: () => <Avatar src="https://randomuser.me/api/portraits/men/40.jpg" />, title: "Dubem Izuorah", hide: !user.value }, { key: "auth", title: user.value ? "Logout" : "Login", onClick: () => user.value = !user.value }, ]); // Filter out hidden items const menuItems = computed(() => items.value.filter(item => !item.hide)); </script>
Key Takeaways:
- Reactive Layout : Use computed properties to update the layout based on reactive data like user.
- Conditional Rendering : Apply different values using ternary operators based on state.
- JSX Integration : Utilize JSX to include HTML elements and Vue components directly within property values.
- Dynamic Properties : Use properties like hide to conditionally display items.
- Event Handling : Store functions or event handlers (e.g., onClick) within data objects.
- Modular Data Management : Move layout data to Vue composables or external JSON files for better organization.
Defining the Avatar Component
Create an Avatar component used within the dynamic navbar.
? Avatar.vue
<template> <div class="rounded-full w-10 h-10 bg-gray-100 overflow-hidden"> <img class="w-full h-full object-cover" :src="src" /> </div> </template> <script setup> const props = defineProps({ src: { type: String, required: true, }, }) </script>
This component creates a reusable avatar element that can display different images based on the ‘src’ prop passed to it. This makes it flexible and easy to use throughout your application for displaying user avatars or profile pictures.
Building the Layout
Use the defined data to render the navbar dynamically.
? App.vue
<template> <nav class="w-screen border-b py-4"> <div class="container mx-auto flex items-center gap-10"> <component v-for="item in menuItems" :key="item.key" :is="item.to ? NuxtLink : 'button'" v-bind="item" @click="item.onClick" class="flex items-center" > <img v-if="item.image" :src="item.image" class="w-10 h-10 object-contain" /> <component v-if="item.render" :is="item.render" /> <component v-if="item.icon" :is="item.icon" :size="24" /> <span v-if="item.title" class="ml-2">{{ item.title }}</span> </component> </div> </nav> <main class="h-64 bg-gray-100 flex justify-center pt-10 text-xl">App Here</main> </template> <script setup lang="jsx"> // The script remains the same as above </script>
Key Takeaways:
- v-bind Usage : Attach multiple properties to elements simultaneously, keeping the template clean.
- Unique Keys : Use the key attribute to prevent rendering issues during dynamic updates.
- Dynamic Components : Utilize Vue’s dynamic components to render different elements based on data.
- Event Binding : Attach events like @click dynamically based on data properties.
- Component Modularity : Break down components further and import them as needed for better scalability.
By following this approach, you create a dynamic and flexible horizontal navbar that’s easy to extend or modify. This method not only saves time and effort but also ensures your codebase remains clean and maintainable.
Enhancing Flexibility with Vue JSX
Vue JSX allows developers to write Vue components using a syntax similar to React’s JSX, offering greater flexibility and expressiveness. Unlike Vue’s typical template-based approach, JSX allows you to embed HTML-like elements directly inside JavaScript logic. This is particularly useful in dynamic layouts where you need to generate or manipulate UI elements based on dynamic data.
Instead of separating logic and markup across different sections of the component (template and script), JSX enables you to manage both in one cohesive block of code.
In our solution, JSX helps simplify how we dynamically render components like the Avatar or conditional elements such as the “Add Funds” button.
For example, instead of hardcoding these elements into a template, we can dynamically generate them using a render function in JavaScript.
This allows us to update components like the navbar with real-time data, such as user authentication status, without duplicating code or scattering logic across the template and script sections.
By using JSX, we maintain cleaner, more maintainable code, while still leveraging Vue’s reactivity and flexibility.
Next Steps
Now that we understand dynamic layouts, it’s time to put your knowledge into practice. Here are some suggested next steps:
- 기존 프로젝트 리팩터링 : 특히 반복적인 HTML 또는 구성 요소 로직이 있는 영역에서 동적 레이아웃을 통해 효율성과 가독성을 높일 수 있는 현재 프로젝트의 일부를 식별하고 리팩터링합니다.
- CMS와 통합: CMS 또는 기타 시스템을 동적 레이아웃과 통합하여 훨씬 더 동적이고 응답성이 뛰어난 사용자 인터페이스를 만들어 보세요.
- 팀과 공동작업: 동적 레이아웃에 대한 통찰력을 팀과 공유하세요. 프로젝트에서 동적 레이아웃을 종합적으로 활용하여 생산성을 높이고 지속적인 개선 문화를 조성할 수 있는 방법에 대해 논의하세요.
- 고급 사용 사례 탐색 : 동적 레이아웃의 고급 응용 프로그램을 계속 탐색합니다. 숙달은 지속적인 연습과 탐구에서 비롯됩니다.
이러한 단계를 수행하면 동적 레이아웃에 능숙해지게 됩니다. 동적 인터페이스를 더욱 원활하게 생성하려면 Vue.js 개발자에게 인기 있는 구성 요소 라이브러리인 Vuetify를 사용한 쉬운 인터페이스 과정을 확인하세요.
동적 레이아웃을 수용함으로써 개발 프로세스를 간소화하고, 애플리케이션의 유연성을 향상시키며, 더 깔끔하고 유지 관리하기 쉬운 코드베이스를 유지할 수 있습니다. 지금 바로 동적 레이아웃을 프로젝트에 통합하고 워크플로우와 애플리케이션 품질에 혁신적인 영향을 미치는 것을 경험해 보세요.
2024년 9월 5일 https://www.vuemastery.com 에 원본 게시.
위 내용은 Vue jsx를 사용한 동적 레이아웃: 유연하고 유지 관리 가능한 UI 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Stock Market GPT
더 현명한 결정을 위한 AI 기반 투자 연구

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

이 기사는 JavaScript를 사용하여 이미지를 클릭하는 효과를 얻는 방법을 소개합니다. 핵심 아이디어는 HTML5의 데이터-* 속성을 사용하여 대체 이미지 경로를 저장하고 JavaScript를 통해 클릭 이벤트를 듣고 SRC 속성을 동적으로 전환하여 이미지 전환을 실현하는 것입니다. 이 기사는 일반적으로 사용되는 대화식 효과를 이해하고 마스터하는 데 도움이되는 자세한 코드 예제 및 설명을 제공합니다.

먼저 브라우저가 geolocationapi를 지원하는지 확인하십시오. 지원되는 경우 GetCurrentPosition ()을 호출하여 사용자의 현재 위치 좌표를 얻고 성공적인 콜백을 통해 위도 및 경도 값을 얻으십시오. 동시에 거부 허가, 위치의 이용 불가능 또는 시간 초과와 같은 오류 콜백 처리 예외를 제공하십시오. 또한 구성 옵션을 전달하여 높은 정밀도를 활성화하고 시간 초과 시간 및 캐시 유효성 기간을 설정할 수도 있습니다. 전체 프로세스에는 사용자 승인 및 해당 오류 처리가 필요합니다.

이 기사는 javaScript에서 document.getElementByid ()를 통해 DOM 요소를 얻을 때 NULL을 반환하는 문제를 해결하는 것을 목표로합니다. 핵심은 스크립트 실행 타이밍 및 DOM 파싱 상태를 이해하는 것입니다. 태그를 올바르게 배치하거나 DomContentLoaded 이벤트를 사용하여 요소가 사용 가능한 경우 다시 시도하여 이러한 오류를 효과적으로 피할 수 있습니다.

Nuxt3의 구성 API 코어 사용에는 다음이 포함됩니다. 1. DefinePagemeta는 제목, 레이아웃 및 미들웨어와 같은 페이지 메타 정보를 정의하는 데 사용됩니다. 이는 직접 호출해야하며 조건부 진술서에 배치 할 수 없습니다. 2. ASSHEAD는 페이지 헤더 태그를 관리하고 정적 및 반응 형 업데이트를 지원하며 SEO 최적화를 달성하기 위해 DefinePagemeta와 협력해야합니다. 3. USEASYNCDATA는 비동기 데이터를 안전하게 얻고 로딩 및 오류 상태를 자동으로 처리하며 서버 및 클라이언트 데이터 수집 제어를 지원하는 데 사용됩니다. 4. UseFetch는 USEASYNCDATA 및 $ FETCH의 캡슐화로, 요청 키를 자동으로 유추하여 중복 요청을 피하십시오.

JavaScript에서 반복 간격을 만들려면 SetInterVal () 함수를 사용해야하며, 이는 지정된 밀리 초 간격으로 기능 또는 코드 블록을 반복적으로 실행합니다. 예를 들어, setInterVal (() => {console.log ( "2 초마다 실행");}, 2000)는 ClearInterval (IntervalId)에 의해 지워질 때까지 2 초마다 메시지를 출력합니다. 실제 애플리케이션에서 클럭, 설문 조사 서버 등을 업데이트하는 데 사용할 수 있지만 최소 지연 한도와 기능 실행 시간의 영향에주의를 기울이고 더 이상 메모리 누출을 피할 필요가없는 시간 간격을 정리하십시오. 특히 구성 요소가 제거되거나 페이지가 닫히기 전에이를 확인하십시오

theBestatorReateAmulti-linestringInjavaScriptSingStisingStisingTemPlatalswithBackTicks, PRESERVEREAKENXACTLYASWRITENTINGSINGISINGSTINGISINGSTISIGINGSTISIGINSTEMPLATALSWITHTING.

이 튜토리얼은 JavaScript에서 두 개의 소수점으로 고정 된 두 가지 소수의 문자열로 숫자를 문자열로 포맷하는 방법에 대해 자세히 설명합니다. 정수도 "#.00"형식으로 표시 될 수 있습니다. 우리는 구문, 기능, 샘플 코드 및 리턴 유형이 항상 문자열 인 것과 같은 숫자의 구문, 기능, 샘플 코드 및 주요 포인트를 포함하여 숫자를 사용하는 데 중점을 둘 것입니다.

Clipboardapi의 WriteText 메소드를 사용하여 클립 보드에 텍스트를 복사하십시오. 보안 컨텍스트 및 사용자 상호 작용에서 호출되어야하며 최신 브라우저를 지원하며 기존 버전은 ExeccCommand로 다운 그레이드 될 수 있습니다.
