사용자 정의 달력 vue 구성 요소를 개발하는 방법 다음 문서에서는 사용자 정의 달력 구성 요소를 캡슐화하는 방법을 단계별로 설명합니다. 이것이 모든 사람에게 도움이 되기를 바랍니다.
우리 모두 알고 있듯이 일반적으로 프로젝트에서 달력 구성 요소를 사용해야 하는 경우 타사 UI 라이브러리의 구성 요소나 기성 타사 플러그인에서 사용되는 경우가 많습니다. 인. 많은 친구들은 달력 구성 요소를 처음 볼 때 무의식적으로 그것이 매우 복잡하고 시작할 방법이 없다고 생각합니다. 그런데 이 캘린더 플러그인의 소스코드를 읽어보니 생각보다 복잡하지 않다는 것을 알게 되었습니다. 저는 달력 컴포넌트를 만들려면 해당 연도를 기준으로 최소 10년 전후의 달력 데이터를 확보해야 다음 개발 단계를 진행할 수 있다는 어리석은 생각을 하곤 했습니다.
그런데 dycalendar.js 소스코드를 읽어보니 한편으로는 제가 너무 멍청하고 문제가 너무 복잡하다는 생각이 들었습니다. 작가님의 명확한 사고방식도 존경스럽습니다. 읽고 나니 많은 유익을 얻었다는 생각이 듭니다.
저자의 아이디어 로직을 정리한 후, 이 아이디어를 바탕으로 Vue 컴포넌트를 개발했습니다. 아래 그림과 같이:
다음으로, 나를 따라 자신만의 달력 구성 요소를 개발하는 방법을 알아보세요. [관련 추천 : vuejs 영상 튜토리얼, 웹 프론트엔드 개발]
핵심 코드 구현
1. 아이디어 정리
- 목표 날짜 데이터 가져오기
- 현재 날짜의 중요한 속성 가져오기, 예:
현재 연도
,현재 월
,현재 날짜
,현재 요일
,몇 개 이번 달의 일수
code>,이번 달의 1일은 요일에 해당합니다
,지난 달의 일 수
, 등.当前年
,当前月
,当前日期
,当前星期几
,当前月一共有几天
,当前月的第一天对应的是星期几
,上个月总共有多少天
等。 - 根据这些属性,来生成具体的
日历日期数据列表
,然后将其循环渲染到模板中。 - 当切换月份的时候,获取到新的目标日期对应的各项关键数据。vue检测到日历属性变化之后,通知页面进行更新。
2、初始化所需要的数据
一般来说,成熟的日历组件,日期都是一个双向绑定的变量。为了方便使用,我们也采用双向绑定的方式。
<script>import { reactive, ref, computed, watch } from "vue";const props = defineProps({ modelValue: Date, });const emits = defineEmits(["update:modelValue"]);/** * 最小年份 */const MIN_YEAR = 1900;/** * 最大年份 */const MAX_YEAR = 9999;/** * 目标日期 */const targetDate = ref(props.modelValue);复制代码</script>
接下来,我们还需要初始化一些常量用来表示月份和日期:
/** * 有关月度的名称列表 */const monthNameList = { chineseFullName: [ "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月", ], fullName: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ], mmm: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ], };/** * 有关周几的名称列表 */const dayNameList = [ { chineseFullName: "周日", chineseShortName: "日", fullName: "Sunday", shortName: "Sun", dayNumber: 0, }, { chineseFullName: "周一", chineseShortName: "一", fullName: "Monday", shortName: "Mon", dayNumber: 1, }, { chineseFullName: "周二", chineseShortName: "二", fullName: "Tuesday", shortName: "Tue", dayNumber: 2, }, { chineseFullName: "周三", chineseShortName: "三", fullName: "Wednesday", shortName: "Wed", dayNumber: 3, }, { chineseFullName: "周四", chineseShortName: "四", fullName: "Thursday", shortName: "Thu", dayNumber: 4, }, { chineseFullName: "周五", chineseShortName: "五", fullName: "Friday", shortName: "Fri", dayNumber: 5, }, { chineseFullName: "周六", chineseShortName: "六", fullName: "Saturday", shortName: "Sat", dayNumber: 6, }, ];复制代码
接下来,准备几个vue的响应式数据:
/** * 今日 */const today = new Date();/** * 日历的各项属性 */const calendarProps = reactive({ target: { year: null, month: null, date: null, day: null, monthShortName: null, monthFullName: null, monthChineseFullName: null, firstDay: null, firstDayIndex: null, totalDays: null, }, previous: { totalDays: null, }, });/** * 用于展现的日历数据 */const calendarData = ref([]);复制代码
3、初始化日历的各项属性
接下来,通过setCalendarProps
方法获取日历的各个属性,逐个填充calendarProps
中的数据:
function setCalendarProps() { if (!targetDate.value) { targetDate.value = today; } // 获取目标日期的年月日星期几数据 calendarProps.target.year = targetDate.value.getFullYear(); calendarProps.target.month = targetDate.value.getMonth(); calendarProps.target.date = targetDate.value.getDate(); calendarProps.target.day = targetDate.value.getDay(); if ( calendarProps.target.year MAX_YEAR ) { console.error("无效的年份,请检查传入的数据是否是正常"); return; } // 获取到目标日期的月份【中文】名称 let dateString; dateString = targetDate.value.toString().split(" "); calendarProps.target.monthShortName = dateString[1]; calendarProps.target.monthFullName = monthNameList.fullName[calendarProps.target.month]; calendarProps.target.monthChineseFullName = monthNameList.chineseFullName[calendarProps.target.month]; // 获取目标月份的第一天是星期几,和在星期几中的索引值 const targetMonthFirstDay = new Date( calendarProps.target.year, calendarProps.target.month, 1 ); calendarProps.target.firstDay = targetMonthFirstDay.getDay(); calendarProps.target.firstDayIndex = dayNameList.findIndex( (day) => day.dayNumber === calendarProps.target.firstDay ); // 获取目标月份总共多少天 const targetMonthLastDay = new Date( calendarProps.target.year, calendarProps.target.month + 1, 0 ); calendarProps.target.totalDays = targetMonthLastDay.getDate(); // 获取目标月份的上个月总共多少天 const previousMonth = new Date( calendarProps.target.year, calendarProps.target.month, 0 ); calendarProps.previous.totalDays = previousMonth.getDate(); }复制代码
需要注意的一个知识点是,在获取本月多少天和上个月多少天的时候,都将date值设置为了
0
。这是因为当date值为0
的时候,返回的Date对象是上个月的最后一天。所以说,为了获取本月多少天,需要将本月的month值加1
。
执行这个方法之后,此时calendarProps
的值为:
4、根据日历属性生成日历日期的数据
当我们已经知道本月第一天对应的周几索引值、本月一共有多少天和上个月一共有多少天这三个核心数据之后,就可以开始生成对应的日历数据了。
思路如下:
- 由于大部分情况下,本月的第一天不是从头开始的,之前的部分是上个月的日期。所以第一行要单独进行处理。
- 设置一个公用的date数值,初始值设置为
1
。然后从本月第一天对应的周几索引值开始进行递增。本月之前的日期和之后的日期设置一个算法进行计算。 - 为了方便之后进行日期切换、样式区分,将生成的数据加工成一个对象,其中包含日期类型——
dateType
,表示是本月还是上月还是下月;
/** * 生成日历的数据 */function setCalendarData() { let i; let date = 1; const originData = []; const firstRow = []; // 设置第一行数据 for (i = 0; i <p>至此,这个日历组件的核心部分的逻辑就已经实现了。你看,是不是很简单?</p><p>接下来,我们只需要根据<code>calendarData</code></p> 이러한 속성을 기반으로 특정 <code>캘린더 날짜 데이터 목록</code>을 생성한 다음 이를 루프의 템플릿으로 렌더링합니다. 🎜🎜월을 전환할 때 새로운 목표 날짜에 해당하는 주요 데이터를 가져옵니다. vue는 달력 속성의 변경 사항을 감지한 후 페이지에 업데이트를 알립니다. 🎜<h3 id="초기화에-필요한-데이터-일반적으로-성숙한-달력-구성-요소에서-날짜는-양방향-바인딩-변수입니다-사용-편의성을-위해-양방향-바인딩도-사용합니다-rrreee-다음으로-월과-날짜를-나타내는-일부-상수도-초기화해야-합니다-rrreee-다음으로-Vue에-대한-일부-반응-데이터를-준비합니다-rrreee-h-data-id-heading-달력의-속성-다음으로-code-setCalendarProps-code-메소드를-통해-달력의-다양한-속성을-얻고-code-calendarProps-code-에-데이터를-하나씩-입력합니다-rrreee-blockquote-주의사항-한-가지-지식-포인트는-이번-달의-일수와-지난-달의-일수를-얻을-때-날짜-값이-code-code-으로-설정된다는-것입니다-날짜-값이-code-code-일-때-반환되는-Date-객체는-이전-달의-마지막-날이기-때문입니다-따라서-이번-달의-일수를-얻으려면-이번-달의-월-값에-code-code-을-추가해야-합니다-blockquote-이-메서드를-실행한-후-code-calendarProps-code-값은-다음과-같습니다-img-src-static-imghwm-default-png-data-src-https-img-php-cn-upload-article-f-b-de-b-dc-df-b-d-c-png-x-oss-process-image-resize-p-class-lazy-alt-vue를-사용하여-사용자-정의-달력-구성-요소를-캡슐화하는-방법에-대한-자세한-설명-loading-lazy-h-data-id-heading-달력-속성을-기반으로-달력-날짜-데이터-생성-알고-있는-경우-strong-이번-달의-일에-해당하는-요일의-색인-값-strong-strong-이번-달의-총-일수-strong-및-strong-이번-달의-총-일수-지난달-strong-핵심-데이터를-수집한-후-해당-캘린더-데이터-생성을-시작할-수-있습니다-strong-아이디어는-다음과-같습니다-strong-ol-대부분의-경우-달의-첫날이-처음부터-시작되지-않기-때문에-이전-부분은-이전-달의-날짜입니다-따라서-첫-번째-줄은-별도로-처리해야-합니다-공개-날짜-값을-설정하고-초기-값은-code-code-로-설정됩니다-그런-다음-strong-매월-일-strong-에-해당하는-요일-색인-값부터-증가하기-시작합니다-이번-달-전후의-날짜를-계산하는-알고리즘을-설정합니다-나중에-날짜-전환-및-스타일-차별화를-용이하게-하기-위해-생성된-데이터는-날짜-유형-code-dateType-code-을-포함하는-개체로-처리되어-이번-달-이전-달-또는-다음-달인지-나타냅니다-Month-ol-rrreee-이-시점에서-이-캘린더-구성-요소의-핵심-로직이-구현되었습니다-보세요-아주-간단하지-않나요-다음으로-해당-HTML-템플릿을-렌더링하고-code-calendarData-code-의-데이터를-기반으로-스타일을-추가하기만-하면-됩니다-h-data-id-heading-템플릿-및-스타일-부분-추가">2. 초기화에 필요한 데이터🎜🎜일반적으로 성숙한 달력 구성 요소에서 날짜는 양방향 바인딩 변수입니다. 사용 편의성을 위해 양방향 바인딩도 사용합니다. 🎜rrreee🎜다음으로 월과 날짜를 나타내는 일부 상수도 초기화해야 합니다. 🎜rrreee🎜다음으로 Vue에 대한 일부 반응 데이터를 준비합니다. 🎜rrreee<h3 data-id="heading-4">3. 달력의 속성🎜🎜다음으로 <code>setCalendarProps</code> 메소드를 통해 달력의 다양한 속성을 얻고 <code>calendarProps</code>에 데이터를 하나씩 입력합니다. 🎜rrreee<blockquote> 🎜주의사항 한 가지 지식 포인트는 이번 달의 일수와 지난 달의 일수를 얻을 때 날짜 값이 <code>0</code>으로 설정된다는 것입니다. 날짜 값이 <code>0</code>일 때 반환되는 Date 객체는 이전 달의 마지막 날이기 때문입니다. 따라서 이번 달의 일수를 얻으려면 이번 달의 월 값에 <code>1</code>을 추가해야 합니다. 🎜</blockquote>🎜이 메서드를 실행한 후 <code>calendarProps</code> 값은 다음과 같습니다. 🎜🎜<img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/024/f9b43de5b51dc0478df08b202300d1c6-2.png?x-oss-process=image/resize,p_40" class="lazy" alt="vue를 사용하여 사용자 정의 달력 구성 요소를 캡슐화하는 방법에 대한 자세한 설명" loading="lazy">🎜<h3 data-id="heading-5">4. 달력 속성을 기반으로 달력 날짜 데이터 생성🎜🎜알고 있는 경우 <strong>이번 달의 1일에 해당하는 요일의 색인 값</strong>, <strong>이번 달의 총 일수</strong> 및 <strong>이번 달의 총 일수 지난달</strong> 핵심 데이터를 수집한 후 해당 캘린더 데이터 생성을 시작할 수 있습니다. 🎜🎜<strong>아이디어는 다음과 같습니다</strong>: 🎜<ol>🎜대부분의 경우 달의 첫날이 처음부터 시작되지 않기 때문에 이전 부분은 이전 달의 날짜입니다. 따라서 첫 번째 줄은 별도로 처리해야 합니다. 🎜🎜공개 날짜 값을 설정하고 초기 값은 <code>1</code>로 설정됩니다. 그런 다음 <strong>매월 1일</strong>에 해당하는 요일 색인 값부터 증가하기 시작합니다. 이번 달 전후의 날짜를 계산하는 알고리즘을 설정합니다. 🎜🎜나중에 날짜 전환 및 스타일 차별화를 용이하게 하기 위해 생성된 데이터는 날짜 유형(<code>dateType</code>)을 포함하는 개체로 처리되어 이번 달, 이전 달 또는 다음 달인지 나타냅니다. Month; 🎜</ol>rrreee🎜이 시점에서 이 캘린더 구성 요소의 핵심 로직이 구현되었습니다. 보세요, 아주 간단하지 않나요? 🎜🎜다음으로, 해당 HTML 템플릿을 렌더링하고 <code>calendarData</code>의 데이터를 기반으로 스타일을 추가하기만 하면 됩니다. 🎜<h3 data-id="heading-6">5. 템플릿 및 스타일 부분 추가</h3> </h3> </h3> </h3><p> 일반적으로 달력 구성 요소는 그리드 형태의 구조를 가지므로 렌더링을 위해 테이블 방식을 선택합니다. 하지만 다른 방법이 있냐고 물으신다면 플렉스 레이아웃이나 그리드 레이아웃을 사용하는 등 아직 몇 가지 방법이 있지만 이 방법을 사용하면 <code>calendarData</code>의 데이터 구조가 지금과 같지 않게 됩니다. </p><p>돔 구조는 아래와 같습니다. </p><p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/024/f9b43de5b51dc0478df08b202300d1c6-2.png?x-oss-process=image/resize,p_40" class="lazy" alt="vue를 사용하여 사용자 정의 달력 구성 요소를 캡슐화하는 방법에 대한 자세한 설명" loading="lazy"></p><p>버튼 테두리의 흐르는 효과에 대해서는 Su Su의 기사를 참조하여 만들었습니다. </p><blockquote><p>Clip-path는 버튼 흐름을 구현합니다. border animation<a href="https://www.php.cn/link/eb04e52cfac45c0399533bfd050d8c22" target="_blank" title="https://www.php.cn/link/eb04e52cfac45c0399533bfd050d8c22">juejin.cn/post /719877…</a></p></blockquote><p>그런 다음 나머지 스타일 부분은 UI 디자인 도면에 따라 즉흥적으로 그리거나 그릴 수 있습니다. <span style="max-width:90%">UI시스터즈의 절묘한 디자인 도안은 다들 경험해보셨을 거라 믿습니다(히히</span></p><p>구체적인 코드 부분은 글에 올리지 않겠습니다. 필요하다면 아래에서 전체 소스코드를 직접 보실 수 있습니다</p><blockquote><p><a href="https://www.php.cn/link/501949e07f27c5dd9ca3b8dc62913aa1" target="_blank" title="https://gitee.com/wushengyuan/diy-calendard/" ref="nofollow noopener noreferrer">gitee. com/ wushengyuan...</a></p></blockquote><h2 id="결론">결론</h2><p>매우 번거롭게 느껴지는 일부 구성 요소의 경우 핵심 로직이 그다지 복잡하지 않을 수도 있습니다. 때로는 코드를 한 줄씩 읽고 아이디어를 명확하게 하는 데 약간의 인내심이 필요할 수도 있습니다. </p><p> (학습 영상 공유: <a href="https://www.php.cn/course/list/18.html" target="_blank">vuejs 입문 튜토리얼</a>, <a href="https://www.php.cn/course/list/91.html" target="_blank" textvalue="编程基础视频">기본 프로그래밍 영상</a>)</p>
위 내용은 vue를 사용하여 사용자 정의 달력 구성 요소를 캡슐화하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Vue.js는 개발 효율성과 사용자 경험을 향상시키기 위해 프론트 엔드 기술 스택과 밀접하게 통합되어 있습니다. 1) 건설 도구 : 모듈 식 개발을 달성하기 위해 웹 팩 및 롤업과 통합. 2) 주 관리 : Vuex와 통합하여 복잡한 응용 프로그램 상태를 관리합니다. 3) 라우팅 : vuerouter와 통합하여 단일 페이지 응용 프로그램 라우팅을 실현합니다. 4) CSS 전 처리기 : 스타일 개발 효율성을 향상시키기 위해 SASS를 지원하고 덜 지원합니다.

Netflix는 React의 구성 요소 설계 및 가상 DOM 메커니즘이 복잡한 인터페이스와 빈번한 업데이트를 효율적으로 처리 할 수 있기 때문에 REACT를 선택했습니다. 1) 구성 요소 기반 설계를 통해 Netflix는 인터페이스를 관리 가능한 위젯으로 분류하여 개발 효율성 및 코드 유지 관리를 향상시킬 수 있습니다. 2) 가상 DOM 메커니즘은 DOM 운영을 최소화하여 Netflix 사용자 인터페이스의 부드러움과 고성능을 보장합니다.

Vue.js는 사용하기 쉽고 강력하기 때문에 개발자에게 사랑을받습니다. 1) 반응 형 데이터 바인딩 시스템은 뷰를 자동으로 업데이트합니다. 2) 구성 요소 시스템은 코드의 재사용 성과 유지 관리를 향상시킵니다. 3) 컴퓨팅 속성 및 청취자는 코드의 가독성과 성능을 향상시킵니다. 4) vuedevtools를 사용하고 콘솔 오류를 확인하는 것이 일반적인 디버깅 기술입니다. 5) 성능 최적화에는 주요 속성, 계산 된 속성 및 유지 구성 요소 사용이 포함됩니다. 6) 모범 사례에는 명확한 구성 요소 이름 지정, 단일 파일 구성 요소 사용 및 수명주기 후크의 합리적인 사용이 포함됩니다.

vue.js는 효율적이고 유지 관리 가능한 프론트 엔드 애플리케이션을 구축하는 데 적합한 점진적인 JavaScript 프레임 워크입니다. 주요 기능은 다음과 같습니다. 1. 응답 데이터 바인딩, 2. 구성 요소 개발, 3. 가상 Dom. 이러한 기능을 통해 vue.js는 개발 프로세스를 단순화하고 응용 프로그램 성능과 유지 관리를 향상시켜 현대 웹 개발에서 매우 인기가 있습니다.

vue.js와 반응은 각각 고유 한 장점과 단점이 있으며, 선택은 프로젝트 요구 사항 및 팀 조건에 따라 다릅니다. 1) vue.js는 단순하고 사용하기 쉬운 소규모 프로젝트 및 초보자에게 적합합니다. 2) REACT는 풍부한 생태계와 구성 요소 설계로 인해 대규모 프로젝트 및 복잡한 UI에 적합합니다.

vue.js는 여러 기능을 통해 사용자 경험을 향상시킵니다. 1. 응답 시스템은 실시간 데이터 피드백을 실현합니다. 2. 구성 요소 개발은 코드 재사용 성을 향상시킵니다. 3. Vuerouter는 원활한 내비게이션을 제공합니다. 4. 동적 데이터 바인딩 및 전환 애니메이션은 상호 작용 효과를 향상시킵니다. 5. 오류 처리 메커니즘은 사용자 피드백을 보장합니다. 6. 성능 최적화 및 모범 사례는 응용 프로그램 성능을 향상시킵니다.

웹 개발에서 vue.js의 역할은 개발 프로세스를 단순화하고 효율성을 향상시키는 점진적인 JavaScript 프레임 워크 역할을하는 것입니다. 1) 개발자는 반응 형 데이터 바인딩 및 구성 요소 개발을 통해 비즈니스 로직에 집중할 수 있습니다. 2) vue.js의 작동 원리는 반응 형 시스템 및 가상 DOM에 의존하여 성능을 최적화합니다. 3) 실제 프로젝트에서는 Vuex를 사용하여 글로벌 상태를 관리하고 데이터 대응 성을 최적화하는 것이 일반적입니다.

vue.js는 2014 년 Yuxi가 출시하여 사용자 인터페이스를 구축하기 위해 진보적 인 JavaScript 프레임 워크입니다. 핵심 장점은 다음과 같습니다. 1. 응답 데이터 바인딩, 데이터 변경의 자동 업데이트보기; 2. 구성 요소 개발, UI는 독립적이고 재사용 가능한 구성 요소로 분할 될 수 있습니다.


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

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

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.
