위챗 애플릿 미니 프로그램 개발 WeChat 애플릿 개발 시 믹스인 확장 추가에 대한 자세한 설명

WeChat 애플릿 개발 시 믹스인 확장 추가에 대한 자세한 설명

Sep 12, 2017 am 11:27 AM
mixin 미니 프로그램 프로그램 개발

Mixin은 부분적으로 구현된 인터페이스를 사용하여 코드 재사용을 달성하는 아이디어입니다. 다중 상속 문제를 해결하는 데 사용할 수 있으며 기능을 확장하는 데 사용할 수 있습니다. 다음 글에서는 위챗 미니 프로그램에 믹스인 확장 기능을 추가하는 방법에 대해 주로 소개합니다. 필요한 친구들이 참고하면 됩니다.

Mixin 소개

Mixin(weaving) 패턴은 GOF의 "디자인 패턴" 요약에 포함되어 있지 않지만, 이 패턴(또는 아이디어)의 일부 응용 프로그램은 다양한 언어와 프레임워크에서 찾을 수 있습니다. 간단히 말해서 Mixin은 전체 또는 부분 구현이 가능한 인터페이스이며 주요 기능은 더 나은 코드 재사용입니다.

Mixin의 개념은 React 및 Vue에서 지원되며 비즈니스 로직을 추상화하고 코드 재사용에 편리함을 제공합니다. 그러나 네이티브 미니 프로그램 프레임워크는 Mixin을 직접 지원하지 않습니다. 먼저 매우 실용적인 요구 사항을 살펴보겠습니다.

모든 미니 프로그램 페이지에 실행 환경 클래스를 추가하면 일부 스타일 해킹을 더 쉽게 할 수 있습니다. 구체적으로, 미니 프로그램이 서로 다른 운영 환경(Developer Tools|iOS|Android)에서 실행될 때 플랫폼 값은 해당 운영 환경 값("ios|android|devtools")이 됩니다.


<view class="{{platform}}">
 <!--页面模板-->
</view>
로그인 후 복사

Review in vue 믹스인의 사용

글 시작 부분에서 언급한 문제는 믹스인을 사용하여 해결하기에 매우 적합합니다. 우리는 이 요구 사항을 Vue 문제로 전환했습니다. 즉, 각 라우팅 페이지에 플랫폼 스타일 클래스를 추가했습니다(비록 실용적이지 않을 수도 있음). 구현 아이디어는 각 라우팅 구성 요소에 data: platform을 추가하는 것입니다. 코드는 다음과 같이 구현됩니다. data: platform。代码实现如下:


// mixins/platform.js
const getPlatform = () => {
 // 具体实现略,这里mock返回&#39;ios&#39;
 return &#39;ios&#39;;
};

export default {
 data() {
 return {
  platform: getPlatform()
 }
 }
}
로그인 후 복사


// 在路由组件中使用
// views/index.vue
import platform from &#39;mixins/platform&#39;;

export default {
 mixins: [platform],
 // ...
}
로그인 후 복사


// 在路由组件中使用
// views/detail.vue
import platform from &#39;mixins/platform&#39;;
export default {
 mixins: [platform],
 // ...
}
로그인 후 복사

这样,在index,detail两个路由页的viewModel上就都有platform这个值,可以直接在模板中使用。

vue中mixin分类

  • data mixin

  • normal method mixin

  • lifecycle method mixin

用代码表示的话,就如:


export default {
 data () {
 return {
  platform: &#39;ios&#39;
 }
 },
 methods: {
 sayHello () {
  console.log(`hello!`)
 }
 },

 created () {
 console.log(`lifecycle3`)
 }
}
로그인 후 복사

vue中mixin合并,执行策略

如果mixin间出现了重复,这些mixin会有具体的合并,执行策略。如下图:

如何让小程序支持mixin

在前面,我们回顾了vue中mixin的相关知识。现在我们要让小程序也支持mixin,实现vue中一样的mixin功能。

实现思路

我们先看一下官方的小程序页面注册方式:


Page({
 data: {
 text: "This is page data."
 },
 onLoad: function(options) {
 // Do some initialize when page load.
 },
 onReady: function() {
 // Do something when page ready.
 },
 onShow: function() {
 // Do something when page show.
 },
 onHide: function() {
 // Do something when page hide.
 },
 onUnload: function() {
 // Do something when page close.
 },
 customData: {
 hi: &#39;MINA&#39;
 }
})
로그인 후 복사

假如我们加入mixin配置,上面的官方注册方式会变成:


Page({
 mixins: [platform],
 data: {
 text: "This is page data."
 },
 onLoad: function(options) {
 // Do some initialize when page load.
 },
 onReady: function() {
 // Do something when page ready.
 },
 onShow: function() {
 // Do something when page show.
 },
 onHide: function() {
 // Do something when page hide.
 },
 onUnload: function() {
 // Do something when page close.
 },
 customData: {
 hi: &#39;MINA&#39;
 }
})
로그인 후 복사

这里有两个点,我们要特别注意:

  • Page(configObj) - 通过configObj配置小程序页面的data, method, lifecycle等

  • onLoad方法 - 页面main入口

要想让mixin中的定义有效,就要在configObj正式传给Page()之前做文章。其实Page(configObj)就是一个普通的函数调用,我们加个中间方法:


Page(createPage(configObj))
로그인 후 복사
로그인 후 복사

在createPage这个方法中,我们可以预处理configObj中的mixin,把其中的配置按正确的方式合并到configObj上,最后交给Page()

/**
 * 为每个页面提供mixin,page invoke桥接
 */

const isArray = v => Array.isArray(v);
const isFunction = v => typeof v === &#39;function&#39;;
const noop = function () {};

// 借鉴redux https://github.com/reactjs/redux
function compose(...funcs) {
 if (funcs.length === 0) {
 return arg => arg;
 }

 if (funcs.length === 1) {
 return funcs[0];
 }

 const last = funcs[funcs.length - 1];
 const rest = funcs.slice(0, -1);
 return (...args) => rest.reduceRight((composed, f) => f(composed), last(...args));
}


// 页面堆栈
const pagesStack = getApp().$pagesStack;

const PAGE_EVENT = [&#39;onLoad&#39;, &#39;onReady&#39;, &#39;onShow&#39;, &#39;onHide&#39;, &#39;onUnload&#39;, &#39;onPullDownRefresh&#39;, &#39;onReachBottom&#39;, &#39;onShareAppMessage&#39;];
const APP_EVENT = [&#39;onLaunch&#39;, &#39;onShow&#39;, &#39;onHide&#39;, &#39;onError&#39;];

const onLoad = function (opts) {
 // 把pageModel放入页面堆栈
 pagesStack.addPage(this);

 this.$invoke = (pagePath, methodName, ...args) => {
 pagesStack.invoke(pagePath, methodName, ...args);
 };

 this.onBeforeLoad(opts);
 this.onNativeLoad(opts);
 this.onAfterLoad(opts);
};

const getMixinData = mixins => {
 let ret = {};

 mixins.forEach(mixin => {
 let { data={} } = mixin;

 Object.keys(data).forEach(key => {
  ret[key] = data[key];
 });
 });

 return ret;
};

const getMixinMethods = mixins => {
 let ret = {};

 mixins.forEach(mixin => {
 let { methods={} } = mixin;

 // 提取methods
 Object.keys(methods).forEach(key => {
  if (isFunction(methods[key])) {
  // mixin中的onLoad方法会被丢弃
  if (key === &#39;onLoad&#39;) return;

  ret[key] = methods[key];
  }
 });

 // 提取lifecycle
 PAGE_EVENT.forEach(key => {
  if (isFunction(mixin[key]) && key !== &#39;onLoad&#39;) {
  if (ret[key]) {
   // 多个mixin有相同lifecycle时,将方法转为数组存储
   ret[key] = ret[key].concat(mixin[key]);
  } else {
   ret[key] = [mixin[key]];
  }
  }
 })
 });

 return ret;
};

/**
 * 重复冲突处理借鉴vue:
 * data, methods会合并,组件自身具有最高优先级,其次mixins中后配置的mixin优先级较高
 * lifecycle不会合并。先顺序执行mixins中的lifecycle,再执行组件自身的lifecycle
 */

const mixData = (minxinData, nativeData) => {
 Object.keys(minxinData).forEach(key => {
 // page中定义的data不会被覆盖
 if (nativeData[key] === undefined) {
  nativeData[key] = minxinData[key];
 }
 });

 return nativeData;
};

const mixMethods = (mixinMethods, pageConf) => {
 Object.keys(mixinMethods).forEach(key => {
 // lifecycle方法
 if (PAGE_EVENT.includes(key)) {
  let methodsList = mixinMethods[key];

  if (isFunction(pageConf[key])) {
  methodsList.push(pageConf[key]);
  }

  pageConf[key] = (function () {
  return function (...args) {
   compose(...methodsList.reverse().map(f => f.bind(this)))(...args);
  };
  })();
 }

 // 普通方法
 else {
  if (pageConf[key] == null) {
  pageConf[key] = mixinMethods[key];
  }
 }
 });

 return pageConf;
};

export default pageConf => {

 let {
 mixins = [],
 onBeforeLoad = noop,
 onAfterLoad = noop
 } = pageConf;

 let onNativeLoad = pageConf.onLoad || noop;
 let nativeData = pageConf.data || {};

 let minxinData = getMixinData(mixins);
 let mixinMethods = getMixinMethods(mixins);

 Object.assign(pageConf, {
 data: mixData(minxinData, nativeData),
 onLoad,
 onBeforeLoad,
 onAfterLoad,
 onNativeLoad,
 });

 pageConf = mixMethods(mixinMethods, pageConf);

 return pageConf;
};
로그인 후 복사
Page(createPage(configObj))
로그인 후 복사
로그인 후 복사

rrreee

이런 방식으로 인덱스 및 세부 라우팅 페이지의 viewModel에는 플랫폼 값이 있으므로 템플릿에서 직접 사용할 수 있습니다.

vue

  • data mixin


  • normal method mixin
  • 의 mixin 분류 lifecycle method mixin

코드로 표현하면 다음과 같습니다:


rrreee

Vue mixin 병합, 실행 전략

mixin 사이에 중복이 있는 경우 이러한 mixin은 구체적인 합병 및 실행 전략이 있습니다. 아래와 같이:

🎜🎜🎜애플릿 지원 mixin을 만드는 방법🎜🎜🎜🎜이전에 vue에서 mixin 관련 지식을 검토했습니다. 이제 미니 프로그램도 mixin을 지원하고 vue에서 동일한 mixin 기능을 실현해야 합니다. 🎜🎜🎜구현 아이디어🎜🎜🎜먼저 공식 미니 프로그램 페이지 등록 방법을 살펴보겠습니다: 🎜🎜🎜🎜rrreee🎜mixin 구성을 추가하면 위 공식 등록 방법은 다음과 같습니다: 🎜🎜🎜🎜rrreee🎜🎜여기서 특별히 주의해야 할 두 가지 사항이 있습니다: 🎜🎜🎜
  • 🎜Page(configObj) - configObj🎜
  • 🎜onLoad 메소드를 통해 미니 프로그램 페이지의 데이터, 메소드, 라이프사이클 등을 구성합니다. - 페이지의 주요 입구🎜
🎜If 믹스인의 정의가 유효하도록 하려면 configObj가 공식적으로 Page()에 전달되기 전에 소란을 피워야 합니다. 실제로 Page(configObj)는 일반적인 함수 호출입니다. 중간 메서드를 추가합니다: 🎜🎜🎜🎜rrreee🎜 createPage 메서드에서는 configObj의 믹스인을 전처리하고 그 안에 구성을 넣을 수 있습니다. . 올바른 방법으로 configObj에 병합하고 마지막으로 Page() 에 넘겨주세요. 이것이 믹스인을 구현하는 아이디어이다. 🎜🎜🎜🎜특정 구현🎜🎜🎜🎜구체적인 코드 구현은 아래에서 자세히 설명하지 않습니다. 더 자세한 코드 구현, 더 많은 확장 기능 및 테스트를 보려면 github🎜🎜🎜🎜rrreee🎜🎜🎜Summary🎜🎜🎜🎜1을 참조하세요. 이 글에서는 주로 작은 프로그램에 믹스인 지원을 추가하는 방법에 대해 설명합니다. 구현 아이디어는 다음과 같습니다. configObj🎜🎜🎜🎜🎜rrreee🎜2. 믹스인 중복을 처리할 때 vue와 일관성을 유지하세요. 🎜🎜 데이터와 메서드가 병합되고 구성 요소 자체가 가장 높은 우선 순위를 가지며 그 다음이 믹스인입니다. 먼저 믹스인에서 구성됩니다. 🎜🎜🎜 수명 주기는 병합되지 않습니다. 먼저 믹스인의 수명주기를 순차적으로 실행한 다음 구성 요소 자체의 수명주기를 실행합니다. 🎜🎜🎜🎜요약🎜🎜🎜

위 내용은 WeChat 애플릿 개발 시 믹스인 확장 추가에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

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

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

Python을 사용하여 WeChat 애플릿 개발 Python을 사용하여 WeChat 애플릿 개발 Jun 17, 2023 pm 06:34 PM

모바일 인터넷 기술과 스마트폰의 대중화로 인해 WeChat은 사람들의 삶에 없어서는 안될 애플리케이션이 되었습니다. WeChat 미니 프로그램을 사용하면 사람들은 애플리케이션을 다운로드하고 설치하지 않고도 미니 프로그램을 직접 사용하여 몇 가지 간단한 요구 사항을 해결할 수 있습니다. 이 기사에서는 Python을 사용하여 WeChat 애플릿을 개발하는 방법을 소개합니다. 1. 준비 Python을 사용하여 WeChat 애플릿을 개발하기 전에 관련 Python 라이브러리를 설치해야 합니다. 여기서는 wxpy와 itchat 두 라이브러리를 사용하는 것이 좋습니다. wxpy는 위챗 머신입니다

작은 프로그램이 반응할 수 있나요? 작은 프로그램이 반응할 수 있나요? Dec 29, 2022 am 11:06 AM

미니 프로그램은 반응을 사용할 수 있습니다. 사용 방법: 1. "react-reconciler"를 기반으로 렌더러를 구현하고 DSL을 생성합니다. 2. DSL을 구문 분석하고 렌더링하기 위한 미니 프로그램 구성 요소를 만듭니다. 3. npm을 설치하고 개발자를 실행합니다. 도구에서 npm을 빌드합니다. 4. 자신의 페이지에 패키지를 소개한 다음 API를 사용하여 개발을 완료합니다.

WeChat 미니 프로그램에서 카드 뒤집기 효과 구현 WeChat 미니 프로그램에서 카드 뒤집기 효과 구현 Nov 21, 2023 am 10:55 AM

WeChat 미니 프로그램에서 카드 뒤집기 효과 구현 WeChat 미니 프로그램에서 카드 뒤집기 효과를 구현하는 것은 사용자 경험과 인터페이스 상호 작용의 매력을 향상시킬 수 있는 일반적인 애니메이션 효과입니다. 다음은 WeChat 애플릿에서 카드 뒤집기 효과를 구현하는 방법을 자세히 소개하고 관련 코드 예제를 제공합니다. 먼저, 미니 프로그램의 페이지 레이아웃 파일에 두 개의 카드 요소를 정의해야 합니다. 하나는 앞면 내용을 표시하기 위한 것이고 다른 하나는 뒷면 내용을 표시하기 위한 것입니다. &lt;--index.wxml- -&gt;&l

Alipay, 희귀 문자 라이브러리를 수집하고 보완하는 '한자 따기-희귀 문자' 미니 프로그램 출시 Alipay, 희귀 문자 라이브러리를 수집하고 보완하는 '한자 따기-희귀 문자' 미니 프로그램 출시 Oct 31, 2023 pm 09:25 PM

10월 31일 이 사이트의 소식에 따르면 올해 5월 27일 Ant Group은 '한자 선택 프로젝트'를 시작한다고 발표했으며 최근 새로운 진전을 보였습니다. Alipay는 '한자 선택 - 흔하지 않은 문자' 미니 프로그램을 출시했습니다. 희귀 캐릭터는 희귀 캐릭터 라이브러리를 보완하고 희귀 캐릭터에 대한 다양한 입력 경험을 제공하여 Alipay의 희귀 캐릭터 입력 방법을 개선하는 데 도움을 줍니다. 현재 사용자는 "한자픽업", "희귀문자" 등의 키워드를 검색하여 "특수문자" 애플릿에 진입할 수 있습니다. 미니 프로그램에서 사용자는 시스템에서 인식 및 입력되지 않은 희귀 문자의 사진을 제출할 수 있으며 확인 후 Alipay 엔지니어가 글꼴 라이브러리에 추가 항목을 작성합니다. 이 웹사이트에서는 미니 프로그램에서도 최신 문자 분할 입력 방식을 경험할 수 있다고 밝혔습니다. 이 입력 방식은 발음이 불분명한 희귀 문자를 위해 설계되었습니다. 사용자 해체

uniapp이 미니 프로그램과 H5 간의 빠른 전환을 달성하는 방법 uniapp이 미니 프로그램과 H5 간의 빠른 전환을 달성하는 방법 Oct 20, 2023 pm 02:12 PM

유니앱이 미니 프로그램과 H5 사이를 빠르게 전환하려면 구체적인 코드 예제가 필요합니다. 최근 모바일 인터넷의 발전과 스마트폰의 대중화로 인해 미니 프로그램과 H5는 필수 애플리케이션 형태가 되었습니다. 크로스 플랫폼 개발 프레임워크인 uniapp은 코드 세트를 기반으로 작은 프로그램과 H5 간의 변환을 신속하게 실현하여 개발 효율성을 크게 향상시킬 수 있습니다. 이 기사에서는 uniapp이 미니 프로그램과 H5 간의 신속한 변환을 달성하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. 유니앱 유니아 소개

Vue에서 CRUD(추가, 삭제, 수정, 확인) 작업을 구현하기 위해 믹스인을 사용하는 팁 Vue에서 CRUD(추가, 삭제, 수정, 확인) 작업을 구현하기 위해 믹스인을 사용하는 팁 Jun 25, 2023 pm 07:42 PM

Vue의 Mixin은 재사용 가능한 코드를 mixin 객체에 캡슐화한 다음 mixin을 사용하여 이러한 코드를 사용해야 하는 구성 요소에 도입할 수 있는 매우 유용한 기능입니다. 이 방법은 특히 일부 반복적인 CRUD(추가, 삭제, 수정) 작업에서 코드의 재사용성과 유지 관리성을 크게 향상시킵니다. 이 기사에서는 믹스인을 사용하여 Vue에서 CRUD 작업을 구현하는 방법을 소개합니다. 먼저, 생성 방법을 이해해야 합니다.

Python으로 간단한 채팅 프로그램 작성 튜토리얼 Python으로 간단한 채팅 프로그램 작성 튜토리얼 May 08, 2023 pm 06:37 PM

구현 아이디어 x01 서버 구축 먼저, 서버 측에서는 소켓을 사용하여 메시지를 수락합니다. 소켓 요청이 수락될 때마다 새 스레드가 열려 메시지 배포 및 수락을 관리합니다. 모든 스레드를 관리하여 채팅방의 다양한 기능 처리를 실현합니다. x02 클라이언트의 설정은 서버보다 훨씬 간단합니다. 클라이언트의 기능은 메시지를 보내고 받는 것뿐이며 특정 문자를 입력하는 것뿐입니다. 따라서 다양한 기능을 사용하려면 클라이언트 측에서 두 개의 스레드만 사용해야 합니다. 하나는 메시지 수신 전용이고 다른 하나는 메시지 전송 전용입니다. 왜냐하면, 오직

미니프로그램 등록 조작방법 미니프로그램 등록 조작방법 Sep 13, 2023 pm 04:36 PM

미니 프로그램 등록 작업 단계: 1. 개인 ID 카드, 기업 사업자 등록증, 법인 ID 카드 및 기타 제출 자료 사본을 준비합니다. 2. 미니 프로그램 관리 배경에 로그인합니다. 4. "기본 설정"을 선택합니다. 5. 제출 정보를 입력합니다. 6. 제출 자료를 업로드합니다. 7. 제출 신청서를 제출합니다. 8. 심사 결과를 기다립니다. 제출이 통과되지 않은 경우 사유에 따라 수정합니다. 9. 제출에 대한 후속 작업은 다음과 같습니다.

See all articles