From b223004221578b7e963386c55fcc51d6ab43be38 Mon Sep 17 00:00:00 2001 From: chenjiahan Date: Tue, 28 Sep 2021 15:49:44 +0800 Subject: [PATCH] Updates --- vite/assets/main.5e9c7f08.js | 8 ++++++++ vite/assets/nested.69dfa8e2.js | 1 + vite/index.html | 4 ++-- vite/mobile.html | 6 +++--- 4 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 vite/assets/main.5e9c7f08.js create mode 100644 vite/assets/nested.69dfa8e2.js diff --git a/vite/assets/main.5e9c7f08.js b/vite/assets/main.5e9c7f08.js new file mode 100644 index 00000000..a7b37143 --- /dev/null +++ b/vite/assets/main.5e9c7f08.js @@ -0,0 +1,8 @@ +var s,a=Object.defineProperty,t=Object.defineProperties,n=Object.getOwnPropertyDescriptors,e=Object.getOwnPropertySymbols,l=Object.prototype.hasOwnProperty,p=Object.prototype.propertyIsEnumerable,c=(s,t,n)=>t in s?a(s,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):s[t]=n;function o(s,a){const t=Object.create(null),n=s.split(",");for(let e=0;e!!t[s.toLowerCase()]:s=>!!t[s]}!function(){const s=document.createElement("link").relList;if(!(s&&s.supports&&s.supports("modulepreload"))){for(const s of document.querySelectorAll('link[rel="modulepreload"]'))a(s);new MutationObserver((s=>{for(const t of s)if("childList"===t.type)for(const s of t.addedNodes)"LINK"===s.tagName&&"modulepreload"===s.rel&&a(s)})).observe(document,{childList:!0,subtree:!0})}function a(s){if(s.ep)return;s.ep=!0;const a=function(s){const a={};return s.integrity&&(a.integrity=s.integrity),s.referrerpolicy&&(a.referrerPolicy=s.referrerpolicy),"use-credentials"===s.crossorigin?a.credentials="include":"anonymous"===s.crossorigin?a.credentials="omit":a.credentials="same-origin",a}(s);fetch(s.href,a)}}();const d=o("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly");function r(s){if(z(s)){const a={};for(let t=0;t{if(s){const t=s.split(h);t.length>1&&(a[t[0].trim()]=t[1].trim())}})),a}function g(s){let a="";if(E(s))a=s;else if(z(s))for(let t=0;tnull==s?"":z(s)||T(s)&&s.toString===N?JSON.stringify(s,m,2):String(s),m=(s,a)=>a&&a.__v_isRef?m(s,a.value):P(a)?{[`Map(${a.size})`]:[...a.entries()].reduce(((s,[a,t])=>(s[`${a} =>`]=t,s)),{})}:I(a)?{[`Set(${a.size})`]:[...a.values()]}:!T(a)||z(a)||L(a)?a:String(a),v={},b=[],f=()=>{},y=()=>!1,q=/^on[^a-z]/,x=s=>q.test(s),w=s=>s.startsWith("onUpdate:"),_=Object.assign,k=(s,a)=>{const t=s.indexOf(a);t>-1&&s.splice(t,1)},S=Object.prototype.hasOwnProperty,C=(s,a)=>S.call(s,a),z=Array.isArray,P=s=>"[object Map]"===F(s),I=s=>"[object Set]"===F(s),O=s=>"function"==typeof s,E=s=>"string"==typeof s,D=s=>"symbol"==typeof s,T=s=>null!==s&&"object"==typeof s,A=s=>T(s)&&O(s.then)&&O(s.catch),N=Object.prototype.toString,F=s=>N.call(s),L=s=>"[object Object]"===F(s),R=s=>E(s)&&"NaN"!==s&&"-"!==s[0]&&""+parseInt(s,10)===s,B=o(",key,ref,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),M=s=>{const a=Object.create(null);return t=>a[t]||(a[t]=s(t))},$=/-(\w)/g,U=M((s=>s.replace($,((s,a)=>a?a.toUpperCase():"")))),V=/\B([A-Z])/g,H=M((s=>s.replace(V,"-$1").toLowerCase())),W=M((s=>s.charAt(0).toUpperCase()+s.slice(1))),G=M((s=>s?`on${W(s)}`:"")),K=(s,a)=>!Object.is(s,a),Q=(s,a)=>{for(let t=0;t{Object.defineProperty(s,a,{configurable:!0,enumerable:!1,value:t})},X=s=>{const a=parseFloat(s);return isNaN(a)?s:a};let J;const Z=[];class ss{constructor(s=!1){this.active=!0,this.effects=[],this.cleanups=[],!s&&J&&(this.parent=J,this.index=(J.scopes||(J.scopes=[])).push(this)-1)}run(s){if(this.active)try{return this.on(),s()}finally{this.off()}}on(){this.active&&(Z.push(this),J=this)}off(){this.active&&(Z.pop(),J=Z[Z.length-1])}stop(s){if(this.active){if(this.effects.forEach((s=>s.stop())),this.cleanups.forEach((s=>s())),this.scopes&&this.scopes.forEach((s=>s.stop(!0))),this.parent&&!s){const s=this.parent.scopes.pop();s&&s!==this&&(this.parent.scopes[this.index]=s,s.index=this.index)}this.active=!1}}}const as=s=>{const a=new Set(s);return a.w=0,a.n=0,a},ts=s=>(s.w&ps)>0,ns=s=>(s.n&ps)>0,es=new WeakMap;let ls=0,ps=1;const cs=[];let os;const ds=Symbol(""),rs=Symbol("");class is{constructor(s,a=null,t){this.fn=s,this.scheduler=a,this.active=!0,this.deps=[],function(s,a){(a=a||J)&&a.active&&a.effects.push(s)}(this,t)}run(){if(!this.active)return this.fn();if(!cs.includes(this))try{return cs.push(os=this),gs.push(us),us=!0,ps=1<<++ls,ls<=30?(({deps:s})=>{if(s.length)for(let a=0;a{const{deps:a}=s;if(a.length){let t=0;for(let n=0;n0?cs[s-1]:void 0}}stop(){this.active&&(hs(this),this.onStop&&this.onStop(),this.active=!1)}}function hs(s){const{deps:a}=s;if(a.length){for(let t=0;t{("length"===a||a>=n)&&c.push(s)}));else switch(void 0!==t&&c.push(p.get(t)),a){case"add":z(s)?R(t)&&c.push(p.get("length")):(c.push(p.get(ds)),P(s)&&c.push(p.get(rs)));break;case"delete":z(s)||(c.push(p.get(ds)),P(s)&&c.push(p.get(rs)));break;case"set":P(s)&&c.push(p.get(ds))}if(1===c.length)c[0]&&qs(c[0]);else{const s=[];for(const a of c)a&&s.push(...a);qs(as(s))}}function qs(s,a){for(const t of z(s)?s:[...s])(t!==os||t.allowRecurse)&&(t.scheduler?t.scheduler():t.run())}const xs=o("__proto__,__v_isRef,__isVue"),ws=new Set(Object.getOwnPropertyNames(Symbol).map((s=>Symbol[s])).filter(D)),_s=Ps(),ks=Ps(!1,!0),Ss=Ps(!0),Cs=zs();function zs(){const s={};return["includes","indexOf","lastIndexOf"].forEach((a=>{s[a]=function(...s){const t=ga(this);for(let a=0,e=this.length;a{s[a]=function(...s){js();const t=ga(this)[a].apply(this,s);return ms(),t}})),s}function Ps(s=!1,a=!1){return function(t,n,e){if("__v_isReactive"===n)return!s;if("__v_isReadonly"===n)return s;if("__v_raw"===n&&e===(s?a?pa:la:a?ea:na).get(t))return t;const l=z(t);if(!s&&l&&C(Cs,n))return Reflect.get(Cs,n,e);const p=Reflect.get(t,n,e);if(D(n)?ws.has(n):xs(n))return p;if(s||vs(t,0,n),a)return p;if(fa(p)){return!l||!R(n)?p.value:p}return T(p)?s?da(p):oa(p):p}}function Is(s=!1){return function(a,t,n,e){let l=a[t];if(!s&&(n=ga(n),l=ga(l),!z(a)&&fa(l)&&!fa(n)))return l.value=n,!0;const p=z(a)&&R(t)?Number(t)!0,deleteProperty:(s,a)=>!0},Ds=_({},Os,{get:ks,set:Is(!0)}),Ts=s=>T(s)?oa(s):s,As=s=>T(s)?da(s):s,Ns=s=>s,Fs=s=>Reflect.getPrototypeOf(s);function Ls(s,a,t=!1,n=!1){const e=ga(s=s.__v_raw),l=ga(a);a!==l&&!t&&vs(e,0,a),!t&&vs(e,0,l);const{has:p}=Fs(e),c=n?Ns:t?As:Ts;return p.call(e,a)?c(s.get(a)):p.call(e,l)?c(s.get(l)):void(s!==e&&s.get(a))}function Rs(s,a=!1){const t=this.__v_raw,n=ga(t),e=ga(s);return s!==e&&!a&&vs(n,0,s),!a&&vs(n,0,e),s===e?t.has(s):t.has(s)||t.has(e)}function Bs(s,a=!1){return s=s.__v_raw,!a&&vs(ga(s),0,ds),Reflect.get(s,"size",s)}function Ms(s){s=ga(s);const a=ga(this);return Fs(a).has.call(a,s)||(a.add(s),ys(a,"add",s,s)),this}function $s(s,a){a=ga(a);const t=ga(this),{has:n,get:e}=Fs(t);let l=n.call(t,s);l||(s=ga(s),l=n.call(t,s));const p=e.call(t,s);return t.set(s,a),l?K(a,p)&&ys(t,"set",s,a):ys(t,"add",s,a),this}function Us(s){const a=ga(this),{has:t,get:n}=Fs(a);let e=t.call(a,s);e||(s=ga(s),e=t.call(a,s)),n&&n.call(a,s);const l=a.delete(s);return e&&ys(a,"delete",s,void 0),l}function Vs(){const s=ga(this),a=0!==s.size,t=s.clear();return a&&ys(s,"clear",void 0,void 0),t}function Hs(s,a){return function(t,n){const e=this,l=e.__v_raw,p=ga(l),c=a?Ns:s?As:Ts;return!s&&vs(p,0,ds),l.forEach(((s,a)=>t.call(n,c(s),c(a),e)))}}function Ws(s,a,t){return function(...n){const e=this.__v_raw,l=ga(e),p=P(l),c="entries"===s||s===Symbol.iterator&&p,o="keys"===s&&p,d=e[s](...n),r=t?Ns:a?As:Ts;return!a&&vs(l,0,o?rs:ds),{next(){const{value:s,done:a}=d.next();return a?{value:s,done:a}:{value:c?[r(s[0]),r(s[1])]:r(s),done:a}},[Symbol.iterator](){return this}}}}function Gs(s){return function(...a){return"delete"!==s&&this}}function Ks(){const s={get(s){return Ls(this,s)},get size(){return Bs(this)},has:Rs,add:Ms,set:$s,delete:Us,clear:Vs,forEach:Hs(!1,!1)},a={get(s){return Ls(this,s,!1,!0)},get size(){return Bs(this)},has:Rs,add:Ms,set:$s,delete:Us,clear:Vs,forEach:Hs(!1,!0)},t={get(s){return Ls(this,s,!0)},get size(){return Bs(this,!0)},has(s){return Rs.call(this,s,!0)},add:Gs("add"),set:Gs("set"),delete:Gs("delete"),clear:Gs("clear"),forEach:Hs(!0,!1)},n={get(s){return Ls(this,s,!0,!0)},get size(){return Bs(this,!0)},has(s){return Rs.call(this,s,!0)},add:Gs("add"),set:Gs("set"),delete:Gs("delete"),clear:Gs("clear"),forEach:Hs(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((e=>{s[e]=Ws(e,!1,!1),t[e]=Ws(e,!0,!1),a[e]=Ws(e,!1,!0),n[e]=Ws(e,!0,!0)})),[s,t,a,n]}const[Qs,Ys,Xs,Js]=Ks();function Zs(s,a){const t=a?s?Js:Xs:s?Ys:Qs;return(a,n,e)=>"__v_isReactive"===n?!s:"__v_isReadonly"===n?s:"__v_raw"===n?a:Reflect.get(C(t,n)&&n in a?t:a,n,e)}const sa={get:Zs(!1,!1)},aa={get:Zs(!1,!0)},ta={get:Zs(!0,!1)},na=new WeakMap,ea=new WeakMap,la=new WeakMap,pa=new WeakMap;function ca(s){return s.__v_skip||!Object.isExtensible(s)?0:function(s){switch(s){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((s=>F(s).slice(8,-1))(s))}function oa(s){return s&&s.__v_isReadonly?s:ra(s,!1,Os,sa,na)}function da(s){return ra(s,!0,Es,ta,la)}function ra(s,a,t,n,e){if(!T(s))return s;if(s.__v_raw&&(!a||!s.__v_isReactive))return s;const l=e.get(s);if(l)return l;const p=ca(s);if(0===p)return s;const c=new Proxy(s,2===p?n:t);return e.set(s,c),c}function ia(s){return ha(s)?ia(s.__v_raw):!(!s||!s.__v_isReactive)}function ha(s){return!(!s||!s.__v_isReadonly)}function ua(s){return ia(s)||ha(s)}function ga(s){const a=s&&s.__v_raw;return a?ga(a):s}function ja(s){return Y(s,"__v_skip",!0),s}function ma(s){bs()&&((s=ga(s)).dep||(s.dep=as()),fs(s.dep))}function va(s,a){(s=ga(s)).dep&&qs(s.dep)}const ba=s=>T(s)?oa(s):s;function fa(s){return Boolean(s&&!0===s.__v_isRef)}class ya{constructor(s,a=!1){this._shallow=a,this.dep=void 0,this.__v_isRef=!0,this._rawValue=a?s:ga(s),this._value=a?s:ba(s)}get value(){return ma(this),this._value}set value(s){s=this._shallow?s:ga(s),K(s,this._rawValue)&&(this._rawValue=s,this._value=this._shallow?s:ba(s),va(this))}}function qa(s,a=!1){return fa(s)?s:new ya(s,a)}function xa(s){return fa(s)?s.value:s}const wa={get:(s,a,t)=>xa(Reflect.get(s,a,t)),set:(s,a,t,n)=>{const e=s[a];return fa(e)&&!fa(t)?(e.value=t,!0):Reflect.set(s,a,t,n)}};function _a(s){return ia(s)?s:new Proxy(s,wa)}class ka{constructor(s,a,t){this._setter=a,this.dep=void 0,this._dirty=!0,this.__v_isRef=!0,this.effect=new is(s,(()=>{this._dirty||(this._dirty=!0,va(this))})),this.__v_isReadonly=t}get value(){const s=ga(this);return ma(s),s._dirty&&(s._dirty=!1,s._value=s.effect.run()),s._value}set value(s){this._setter(s)}}function Sa(s,a){let t,n;O(s)?(t=s,n=f):(t=s.get,n=s.set);return new ka(t,n,O(s)||!s.set)}Promise.resolve();function Ca(s,a,...t){const n=s.vnode.props||v;let e=t;const l=a.startsWith("update:"),p=l&&a.slice(7);if(p&&p in n){const s=`${"modelValue"===p?"model":p}Modifiers`,{number:a,trim:l}=n[s]||v;l?e=t.map((s=>s.trim())):a&&(e=t.map(X))}let c,o=n[c=G(a)]||n[c=G(U(a))];!o&&l&&(o=n[c=G(H(a))]),o&&Gn(o,s,6,e);const d=n[c+"Once"];if(d){if(s.emitted){if(s.emitted[c])return}else s.emitted={};s.emitted[c]=!0,Gn(d,s,6,e)}}function za(s,a,t=!1){const n=a.emitsCache,e=n.get(s);if(void 0!==e)return e;const l=s.emits;let p={},c=!1;if(!O(s)){const n=s=>{const t=za(s,a,!0);t&&(c=!0,_(p,t))};!t&&a.mixins.length&&a.mixins.forEach(n),s.extends&&n(s.extends),s.mixins&&s.mixins.forEach(n)}return l||c?(z(l)?l.forEach((s=>p[s]=null)):_(p,l),n.set(s,p),p):(n.set(s,null),null)}function Pa(s,a){return!(!s||!x(a))&&(a=a.slice(2).replace(/Once$/,""),C(s,a[0].toLowerCase()+a.slice(1))||C(s,H(a))||C(s,a))}let Ia=null,Oa=null;function Ea(s){const a=Ia;return Ia=s,Oa=s&&s.type.__scopeId||null,a}function Da(s,a=Ia,t){if(!a)return s;if(s._n)return s;const n=(...t)=>{n._d&&dn(-1);const e=Ea(a),l=s(...t);return Ea(e),n._d&&dn(1),l};return n._n=!0,n._c=!0,n._d=!0,n}function Ta(s){const{type:a,vnode:t,proxy:n,withProxy:e,props:l,propsOptions:[p],slots:c,attrs:o,emit:d,render:r,renderCache:i,data:h,setupState:u,ctx:g,inheritAttrs:j}=s;let m;const v=Ea(s);try{let s;if(4&t.shapeFlag){const a=e||n;m=kn(r.call(a,a,i,l,u,h,g)),s=o}else{const t=a;0,m=kn(t.length>1?t(l,{attrs:o,slots:c,emit:d}):t(l,null)),s=a.props?o:Aa(o)}let v=m;if(s&&!1!==j){const a=Object.keys(s),{shapeFlag:t}=v;a.length&&(1&t||6&t)&&(p&&a.some(w)&&(s=Na(s,p)),v=qn(v,s))}0,t.dirs&&(v.dirs=v.dirs?v.dirs.concat(t.dirs):t.dirs),t.transition&&(v.transition=t.transition),m=v}catch(b){ln.length=0,Kn(b,s,1),m=yn(nn)}return Ea(v),m}const Aa=s=>{let a;for(const t in s)("class"===t||"style"===t||x(t))&&((a||(a={}))[t]=s[t]);return a},Na=(s,a)=>{const t={};for(const n in s)w(n)&&n.slice(9)in a||(t[n]=s[n]);return t};function Fa(s,a,t){const n=Object.keys(a);if(n.length!==Object.keys(s).length)return!0;for(let e=0;e1)return t&&O(a)?a.call(n.proxy):a}}const Ba=[Function,Array],Ma={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Ba,onEnter:Ba,onAfterEnter:Ba,onEnterCancelled:Ba,onBeforeLeave:Ba,onLeave:Ba,onAfterLeave:Ba,onLeaveCancelled:Ba,onBeforeAppear:Ba,onAppear:Ba,onAfterAppear:Ba,onAppearCancelled:Ba},setup(s,{slots:a}){const t=Fn(),n=function(){const s={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return ot((()=>{s.isMounted=!0})),it((()=>{s.isUnmounting=!0})),s}();let e;return()=>{const l=a.default&&Ga(a.default(),!0);if(!l||!l.length)return;const p=ga(s),{mode:c}=p,o=l[0];if(n.isLeaving)return Va(o);const d=Ha(o);if(!d)return Va(o);const r=Ua(d,p,n,t);Wa(d,r);const i=t.subTree,h=i&&Ha(i);let u=!1;const{getTransitionKey:g}=d.type;if(g){const s=g();void 0===e?e=s:s!==e&&(e=s,u=!0)}if(h&&h.type!==nn&&(!jn(d,h)||u)){const s=Ua(h,p,n,t);if(Wa(h,s),"out-in"===c)return n.isLeaving=!0,s.afterLeave=()=>{n.isLeaving=!1,t.update()},Va(o);"in-out"===c&&d.type!==nn&&(s.delayLeave=(s,a,t)=>{$a(n,h)[String(h.key)]=h,s._leaveCb=()=>{a(),s._leaveCb=void 0,delete r.delayedLeave},r.delayedLeave=t})}return o}}};function $a(s,a){const{leavingVNodes:t}=s;let n=t.get(a.type);return n||(n=Object.create(null),t.set(a.type,n)),n}function Ua(s,a,t,n){const{appear:e,mode:l,persisted:p=!1,onBeforeEnter:c,onEnter:o,onAfterEnter:d,onEnterCancelled:r,onBeforeLeave:i,onLeave:h,onAfterLeave:u,onLeaveCancelled:g,onBeforeAppear:j,onAppear:m,onAfterAppear:v,onAppearCancelled:b}=a,f=String(s.key),y=$a(t,s),q=(s,a)=>{s&&Gn(s,n,9,a)},x={mode:l,persisted:p,beforeEnter(a){let n=c;if(!t.isMounted){if(!e)return;n=j||c}a._leaveCb&&a._leaveCb(!0);const l=y[f];l&&jn(s,l)&&l.el._leaveCb&&l.el._leaveCb(),q(n,[a])},enter(s){let a=o,n=d,l=r;if(!t.isMounted){if(!e)return;a=m||o,n=v||d,l=b||r}let p=!1;const c=s._enterCb=a=>{p||(p=!0,q(a?l:n,[s]),x.delayedLeave&&x.delayedLeave(),s._enterCb=void 0)};a?(a(s,c),a.length<=1&&c()):c()},leave(a,n){const e=String(s.key);if(a._enterCb&&a._enterCb(!0),t.isUnmounting)return n();q(i,[a]);let l=!1;const p=a._leaveCb=t=>{l||(l=!0,n(),q(t?g:u,[a]),a._leaveCb=void 0,y[e]===s&&delete y[e])};y[e]=s,h?(h(a,p),h.length<=1&&p()):p()},clone:s=>Ua(s,a,t,n)};return x}function Va(s){if(Ya(s))return(s=qn(s)).children=null,s}function Ha(s){return Ya(s)?s.children?s.children[0]:void 0:s}function Wa(s,a){6&s.shapeFlag&&s.component?Wa(s.component.subTree,a):128&s.shapeFlag?(s.ssContent.transition=a.clone(s.ssContent),s.ssFallback.transition=a.clone(s.ssFallback)):s.transition=a}function Ga(s,a=!1){let t=[],n=0;for(let e=0;e1)for(let e=0;e!!s.type.__asyncLoader,Ya=s=>s.type.__isKeepAlive,Xa={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(s,{slots:a}){const t=Fn(),n=t.ctx;if(!n.renderer)return a.default;const e=new Map,l=new Set;let p=null;const c=t.suspense,{renderer:{p:o,m:d,um:r,o:{createElement:i}}}=n,h=i("div");function u(s){nt(s),r(s,t,c)}function g(s){e.forEach(((a,t)=>{const n=Hn(a.type);!n||s&&s(n)||j(t)}))}function j(s){const a=e.get(s);p&&a.type===p.type?p&&nt(p):u(a),e.delete(s),l.delete(s)}n.activate=(s,a,t,n,e)=>{const l=s.component;d(s,a,t,0,c),o(l.vnode,s,a,t,l,c,n,s.slotScopeIds,e),Wt((()=>{l.isDeactivated=!1,l.a&&Q(l.a);const a=s.props&&s.props.onVnodeMounted;a&&Qt(a,l.parent,s)}),c)},n.deactivate=s=>{const a=s.component;d(s,h,null,1,c),Wt((()=>{a.da&&Q(a.da);const t=s.props&&s.props.onVnodeUnmounted;t&&Qt(t,a.parent,s),a.isDeactivated=!0}),c)},ve((()=>[s.include,s.exclude]),(([s,a])=>{s&&g((a=>Ja(s,a))),a&&g((s=>!Ja(a,s)))}),{flush:"post",deep:!0});let m=null;const v=()=>{null!=m&&e.set(m,et(t.subTree))};return ot(v),rt(v),it((()=>{e.forEach((s=>{const{subTree:a,suspense:n}=t,e=et(a);if(s.type!==e.type)u(s);else{nt(e);const s=e.component.da;s&&Wt(s,n)}}))})),()=>{if(m=null,!a.default)return null;const t=a.default(),n=t[0];if(t.length>1)return p=null,t;if(!(gn(n)&&(4&n.shapeFlag||128&n.shapeFlag)))return p=null,n;let c=et(n);const o=c.type,d=Hn(Qa(c)?c.type.__asyncResolved||{}:o),{include:r,exclude:i,max:h}=s;if(r&&(!d||!Ja(r,d))||i&&d&&Ja(i,d))return p=c,n;const u=null==c.key?o:c.key,g=e.get(u);return c.el&&(c=qn(c),128&n.shapeFlag&&(n.ssContent=c)),m=u,g?(c.el=g.el,c.component=g.component,c.transition&&Wa(c,c.transition),c.shapeFlag|=512,l.delete(u),l.add(u)):(l.add(u),h&&l.size>parseInt(h,10)&&j(l.values().next().value)),c.shapeFlag|=256,p=c,n}}};function Ja(s,a){return z(s)?s.some((s=>Ja(s,a))):E(s)?s.split(",").indexOf(a)>-1:!!s.test&&s.test(a)}function Za(s,a){at(s,"a",a)}function st(s,a){at(s,"da",a)}function at(s,a,t=Nn){const n=s.__wdc||(s.__wdc=()=>{let a=t;for(;a;){if(a.isDeactivated)return;a=a.parent}s()});if(lt(a,n,t),t){let s=t.parent;for(;s&&s.parent;)Ya(s.parent.vnode)&&tt(n,a,t,s),s=s.parent}}function tt(s,a,t,n){const e=lt(a,s,n,!0);ht((()=>{k(n[a],e)}),t)}function nt(s){let a=s.shapeFlag;256&a&&(a-=256),512&a&&(a-=512),s.shapeFlag=a}function et(s){return 128&s.shapeFlag?s.ssContent:s}function lt(s,a,t=Nn,n=!1){if(t){const e=t[s]||(t[s]=[]),l=a.__weh||(a.__weh=(...n)=>{if(t.isUnmounted)return;js(),Ln(t);const e=Gn(a,t,s,n);return Rn(),ms(),e});return n?e.unshift(l):e.push(l),l}}const pt=s=>(a,t=Nn)=>(!Mn||"sp"===s)&<(s,a,t),ct=pt("bm"),ot=pt("m"),dt=pt("bu"),rt=pt("u"),it=pt("bum"),ht=pt("um"),ut=pt("sp"),gt=pt("rtg"),jt=pt("rtc");function mt(s,a=Nn){lt("ec",s,a)}let vt=!0;function bt(s){const a=qt(s),t=s.proxy,n=s.ctx;vt=!1,a.beforeCreate&&ft(a.beforeCreate,s,"bc");const{data:e,computed:l,methods:p,watch:c,provide:o,inject:d,created:r,beforeMount:i,mounted:h,beforeUpdate:u,updated:g,activated:j,deactivated:m,beforeDestroy:v,beforeUnmount:b,destroyed:y,unmounted:q,render:x,renderTracked:w,renderTriggered:_,errorCaptured:k,serverPrefetch:S,expose:C,inheritAttrs:P,components:I,directives:E,filters:D}=a;if(d&&function(s,a,t=f,n=!1){z(s)&&(s=kt(s));for(const e in s){const t=s[e];let l;l=T(t)?"default"in t?Ra(t.from||e,t.default,!0):Ra(t.from||e):Ra(t),fa(l)&&n?Object.defineProperty(a,e,{enumerable:!0,configurable:!0,get:()=>l.value,set:s=>l.value=s}):a[e]=l}}(d,n,null,s.appContext.config.unwrapInjectedRef),p)for(const f in p){const s=p[f];O(s)&&(n[f]=s.bind(t))}if(e){const a=e.call(t,t);T(a)&&(s.data=oa(a))}if(vt=!0,l)for(const z in l){const s=l[z],a=Sa({get:O(s)?s.bind(t,t):O(s.get)?s.get.bind(t,t):f,set:!O(s)&&O(s.set)?s.set.bind(t):f});Object.defineProperty(n,z,{enumerable:!0,configurable:!0,get:()=>a.value,set:s=>a.value=s})}if(c)for(const f in c)yt(c[f],n,t,f);if(o){const s=O(o)?o.call(t):o;Reflect.ownKeys(s).forEach((a=>{La(a,s[a])}))}function A(s,a){z(a)?a.forEach((a=>s(a.bind(t)))):a&&s(a.bind(t))}if(r&&ft(r,s,"c"),A(ct,i),A(ot,h),A(dt,u),A(rt,g),A(Za,j),A(st,m),A(mt,k),A(jt,w),A(gt,_),A(it,b),A(ht,q),A(ut,S),z(C))if(C.length){const a=s.exposed||(s.exposed={});C.forEach((s=>{Object.defineProperty(a,s,{get:()=>t[s],set:a=>t[s]=a})}))}else s.exposed||(s.exposed={});x&&s.render===f&&(s.render=x),null!=P&&(s.inheritAttrs=P),I&&(s.components=I),E&&(s.directives=E)}function ft(s,a,t){Gn(z(s)?s.map((s=>s.bind(a.proxy))):s.bind(a.proxy),a,t)}function yt(s,a,t,n){const e=n.includes(".")?ye(t,n):()=>t[n];if(E(s)){const t=a[s];O(t)&&ve(e,t)}else if(O(s))ve(e,s.bind(t));else if(T(s))if(z(s))s.forEach((s=>yt(s,a,t,n)));else{const n=O(s.handler)?s.handler.bind(t):a[s.handler];O(n)&&ve(e,n,s)}}function qt(s){const a=s.type,{mixins:t,extends:n}=a,{mixins:e,optionsCache:l,config:{optionMergeStrategies:p}}=s.appContext,c=l.get(a);let o;return c?o=c:e.length||t||n?(o={},e.length&&e.forEach((s=>xt(o,s,p,!0))),xt(o,a,p)):o=a,l.set(a,o),o}function xt(s,a,t,n=!1){const{mixins:e,extends:l}=a;l&&xt(s,l,t,!0),e&&e.forEach((a=>xt(s,a,t,!0)));for(const p in a)if(n&&"expose"===p);else{const n=wt[p]||t&&t[p];s[p]=n?n(s[p],a[p]):a[p]}return s}const wt={data:_t,props:Ct,emits:Ct,methods:Ct,computed:Ct,beforeCreate:St,created:St,beforeMount:St,mounted:St,beforeUpdate:St,updated:St,beforeDestroy:St,destroyed:St,activated:St,deactivated:St,errorCaptured:St,serverPrefetch:St,components:Ct,directives:Ct,watch:function(s,a){if(!s)return a;if(!a)return s;const t=_(Object.create(null),s);for(const n in a)t[n]=St(s[n],a[n]);return t},provide:_t,inject:function(s,a){return Ct(kt(s),kt(a))}};function _t(s,a){return a?s?function(){return _(O(s)?s.call(this,this):s,O(a)?a.call(this,this):a)}:a:s}function kt(s){if(z(s)){const a={};for(let t=0;t{o=!0;const[t,n]=Ot(s,a,!0);_(p,t),n&&c.push(...n)};!t&&a.mixins.length&&a.mixins.forEach(n),s.extends&&n(s.extends),s.mixins&&s.mixins.forEach(n)}if(!l&&!o)return n.set(s,b),b;if(z(l))for(let r=0;r-1,t[1]=n<0||a-1||C(t,"default"))&&c.push(s)}}}const d=[p,c];return n.set(s,d),d}function Et(s){return"$"!==s[0]}function Dt(s){const a=s&&s.toString().match(/^\s*function (\w+)/);return a?a[1]:null===s?"null":""}function Tt(s,a){return Dt(s)===Dt(a)}function At(s,a){return z(a)?a.findIndex((a=>Tt(a,s))):O(a)&&Tt(a,s)?0:-1}const Nt=s=>"_"===s[0]||"$stable"===s,Ft=s=>z(s)?s.map(kn):[kn(s)],Lt=(s,a,t)=>{const n=Da((s=>Ft(a(s))),t);return n._c=!1,n},Rt=(s,a,t)=>{const n=s._ctx;for(const e in s){if(Nt(e))continue;const t=s[e];if(O(t))a[e]=Lt(0,t,n);else if(null!=t){const s=Ft(t);a[e]=()=>s}}},Bt=(s,a)=>{const t=Ft(a);s.slots.default=()=>t};function Mt(s,a){if(null===Ia)return s;const t=Ia.proxy,n=s.dirs||(s.dirs=[]);for(let e=0;e(l.has(s)||(s&&O(s.install)?(l.add(s),s.install(c,...a)):O(s)&&(l.add(s),s(c,...a))),c),mixin:s=>(e.mixins.includes(s)||e.mixins.push(s),c),component:(s,a)=>a?(e.components[s]=a,c):e.components[s],directive:(s,a)=>a?(e.directives[s]=a,c):e.directives[s],mount(l,o,d){if(!p){const r=yn(t,n);return r.appContext=e,o&&a?a(r,l):s(r,l,d),p=!0,c._container=l,l.__vue_app__=c,r.component.proxy}},unmount(){p&&(s(null,c._container),delete c._container.__vue_app__)},provide:(s,a)=>(e.provides[s]=a,c)};return c}}const Wt=function(s,a){a&&a.pendingBranch?z(s)?a.effects.push(...s):a.effects.push(s):ie(s,ne,te,ee)};function Gt(s){return function(s,a){const{insert:t,remove:n,patchProp:e,createElement:l,createText:p,createComment:c,setText:o,setElementText:d,parentNode:r,nextSibling:i,setScopeId:h=f,cloneNode:u,insertStaticContent:g}=s,j=(s,a,t,n=null,e=null,l=null,p=!1,c=null,o=!!a.dynamicChildren)=>{if(s===a)return;s&&!jn(s,a)&&(n=as(s),G(s,e,l,!0),s=null),-2===a.patchFlag&&(o=!1,a.dynamicChildren=null);const{type:d,ref:r,shapeFlag:i}=a;switch(d){case tn:m(s,a,t,n);break;case nn:y(s,a,t,n);break;case en:null==s&&q(a,t,n,p);break;case an:D(s,a,t,n,e,l,p,c,o);break;default:1&i?k(s,a,t,n,e,l,p,c,o):6&i?T(s,a,t,n,e,l,p,c,o):(64&i||128&i)&&d.process(s,a,t,n,e,l,p,c,o,ns)}null!=r&&e&&Kt(r,s&&s.ref,l,a||s,!a)},m=(s,a,n,e)=>{if(null==s)t(a.el=p(a.children),n,e);else{const t=a.el=s.el;a.children!==s.children&&o(t,a.children)}},y=(s,a,n,e)=>{null==s?t(a.el=c(a.children||""),n,e):a.el=s.el},q=(s,a,t,n)=>{[s.el,s.anchor]=g(s.children,a,t,n)},x=({el:s,anchor:a},n,e)=>{let l;for(;s&&s!==a;)l=i(s),t(s,n,e),s=l;t(a,n,e)},w=({el:s,anchor:a})=>{let t;for(;s&&s!==a;)t=i(s),n(s),s=t;n(a)},k=(s,a,t,n,e,l,p,c,o)=>{p=p||"svg"===a.type,null==s?S(a,t,n,e,l,p,c,o):I(s,a,e,l,p,c,o)},S=(s,a,n,p,c,o,r,i)=>{let h,g;const{type:j,props:m,shapeFlag:v,transition:b,patchFlag:f,dirs:y}=s;if(s.el&&void 0!==u&&-1===f)h=s.el=u(s.el);else{if(h=s.el=l(s.type,o,m&&m.is,m),8&v?d(h,s.children):16&v&&P(s.children,h,null,p,c,o&&"foreignObject"!==j,r,i),y&&$t(s,null,p,"created"),m){for(const a in m)"value"===a||B(a)||e(h,a,null,m[a],o,s.children,p,c,Z);"value"in m&&e(h,"value",null,m.value),(g=m.onVnodeBeforeMount)&&Qt(g,p,s)}z(h,s,s.scopeId,r,p)}y&&$t(s,null,p,"beforeMount");const q=(!c||c&&!c.pendingBranch)&&b&&!b.persisted;q&&b.beforeEnter(h),t(h,a,n),((g=m&&m.onVnodeMounted)||q||y)&&Wt((()=>{g&&Qt(g,p,s),q&&b.enter(h),y&&$t(s,null,p,"mounted")}),c)},z=(s,a,t,n,e)=>{if(t&&h(s,t),n)for(let l=0;l{for(let d=o;d{const o=a.el=s.el;let{patchFlag:r,dynamicChildren:i,dirs:h}=a;r|=16&s.patchFlag;const u=s.props||v,g=a.props||v;let j;if((j=g.onVnodeBeforeUpdate)&&Qt(j,t,a,s),h&&$t(a,s,t,"beforeUpdate"),r>0){if(16&r)E(o,a,u,g,t,n,l);else if(2&r&&u.class!==g.class&&e(o,"class",null,g.class,l),4&r&&e(o,"style",u.style,g.style,l),8&r){const p=a.dynamicProps;for(let a=0;a{j&&Qt(j,t,a,s),h&&$t(a,s,t,"updated")}),n)},O=(s,a,t,n,e,l,p)=>{for(let c=0;c{if(t!==n){for(const o in n){if(B(o))continue;const d=n[o],r=t[o];d!==r&&"value"!==o&&e(s,o,r,d,c,a.children,l,p,Z)}if(t!==v)for(const o in t)B(o)||o in n||e(s,o,t[o],null,c,a.children,l,p,Z);"value"in n&&e(s,"value",t.value,n.value)}},D=(s,a,n,e,l,c,o,d,r)=>{const i=a.el=s?s.el:p(""),h=a.anchor=s?s.anchor:p("");let{patchFlag:u,dynamicChildren:g,slotScopeIds:j}=a;j&&(d=d?d.concat(j):j),null==s?(t(i,n,e),t(h,n,e),P(a.children,n,h,l,c,o,d,r)):u>0&&64&u&&g&&s.dynamicChildren?(O(s.dynamicChildren,g,n,l,c,o,d),(null!=a.key||l&&a===l.subTree)&&Yt(s,a,!0)):M(s,a,n,h,l,c,o,d,r)},T=(s,a,t,n,e,l,p,c,o)=>{a.slotScopeIds=c,null==s?512&a.shapeFlag?e.ctx.activate(a,t,n,p,o):N(a,t,n,e,l,p,o):F(s,a,o)},N=(s,a,t,n,e,l,p)=>{const c=s.component=function(s,a,t){const n=s.type,e=(a?a.appContext:s.appContext)||Tn,l={uid:An++,vnode:s,type:n,parent:a,appContext:e,root:null,next:null,subTree:null,update:null,scope:new ss(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:a?a.provides:Object.create(e.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Ot(n,e),emitsOptions:za(n,e),emit:null,emitted:null,propsDefaults:v,inheritAttrs:n.inheritAttrs,ctx:v,data:v,props:v,attrs:v,slots:v,refs:v,setupState:v,setupContext:null,suspense:t,suspenseId:t?t.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};l.ctx={_:l},l.root=a?a.root:l,l.emit=Ca.bind(null,l),s.ce&&s.ce(l);return l}(s,n,e);if(Ya(s)&&(c.ctx.renderer=ns),function(s,a=!1){Mn=a;const{props:t,children:n}=s.vnode,e=Bn(s);zt(s,t,e,a),((s,a)=>{if(32&s.vnode.shapeFlag){const t=a._;t?(s.slots=ga(a),Y(a,"_",t)):Rt(a,s.slots={})}else s.slots={},a&&Bt(s,a);Y(s.slots,mn,1)})(s,n);const l=e?function(s,a){const t=s.type;s.accessCache=Object.create(null),s.proxy=ja(new Proxy(s.ctx,Dn));const{setup:n}=t;if(n){const t=s.setupContext=n.length>1?function(s){const a=a=>{s.exposed=a||{}};let t;return{get attrs(){return t||(t=function(s){return new Proxy(s.attrs,{get:(a,t)=>(vs(s,0,"$attrs"),a[t])})}(s))},slots:s.slots,emit:s.emit,expose:a}}(s):null;Ln(s),js();const e=Wn(n,s,0,[s.props,t]);if(ms(),Rn(),A(e)){if(e.then(Rn,Rn),a)return e.then((a=>{$n(s,a)})).catch((a=>{Kn(a,s,0)}));s.asyncDep=e}else $n(s,e)}else Un(s)}(s,a):void 0;Mn=!1}(c),c.asyncDep){if(e&&e.registerDep(c,L),!s.el){const s=c.subTree=yn(nn);y(null,s,a,t)}}else L(c,s,a,t,e,l,p)},F=(s,a,t)=>{const n=a.component=s.component;if(function(s,a,t){const{props:n,children:e,component:l}=s,{props:p,children:c,patchFlag:o}=a,d=l.emitsOptions;if(a.dirs||a.transition)return!0;if(!(t&&o>=0))return!(!e&&!c||c&&c.$stable)||n!==p&&(n?!p||Fa(n,p,d):!!p);if(1024&o)return!0;if(16&o)return n?Fa(n,p,d):!!p;if(8&o){const s=a.dynamicProps;for(let a=0;aJn&&Xn.splice(a,1)}(n.update),n.update()}else a.component=s.component,a.el=s.el,n.vnode=a},L=(s,a,t,n,e,l,p)=>{const c=new is((()=>{if(s.isMounted){let a,{next:t,bu:n,u:o,parent:d,vnode:i}=s,h=t;t?(t.el=i.el,R(s,t,p)):t=i,c.allowRecurse=!1,n&&Q(n),(a=t.props&&t.props.onVnodeBeforeUpdate)&&Qt(a,d,t,i),c.allowRecurse=!0;const u=Ta(s),g=s.subTree;s.subTree=u,j(g,u,r(g.el),as(g),s,e,l),t.el=u.el,null===h&&function({vnode:s,parent:a},t){for(;a&&a.subTree===s;)(s=a.vnode).el=t,a=a.parent}(s,u.el),o&&Wt(o,e),(a=t.props&&t.props.onVnodeUpdated)&&Wt((()=>Qt(a,d,t,i)),e)}else{let p;const{el:o,props:d}=a,{bm:r,m:i,parent:h}=s;if(c.allowRecurse=!1,r&&Q(r),(p=d&&d.onVnodeBeforeMount)&&Qt(p,h,a),c.allowRecurse=!0,o&&ls){const t=()=>{s.subTree=Ta(s),ls(o,s.subTree,s,e,null)};Qa(a)?a.type.__asyncLoader().then((()=>!s.isUnmounted&&t())):t()}else{const p=s.subTree=Ta(s);j(null,p,t,n,s,e,l),a.el=p.el}if(i&&Wt(i,e),p=d&&d.onVnodeMounted){const s=a;Wt((()=>Qt(p,h,s)),e)}256&a.shapeFlag&&s.a&&Wt(s.a,e),s.isMounted=!0,a=t=n=null}}),(()=>de(s.update)),s.scope),o=s.update=c.run.bind(c);o.id=s.uid,c.allowRecurse=o.allowRecurse=!0,o()},R=(s,a,t)=>{a.component=s;const n=s.vnode.props;s.vnode=a,s.next=null,function(s,a,t,n){const{props:e,attrs:l,vnode:{patchFlag:p}}=s,c=ga(e),[o]=s.propsOptions;let d=!1;if(!(n||p>0)||16&p){let n;Pt(s,a,e,l)&&(d=!0);for(const l in c)a&&(C(a,l)||(n=H(l))!==l&&C(a,n))||(o?!t||void 0===t[l]&&void 0===t[n]||(e[l]=It(o,c,l,void 0,s,!0)):delete e[l]);if(l!==c)for(const s in l)a&&C(a,s)||(delete l[s],d=!0)}else if(8&p){const t=s.vnode.dynamicProps;for(let n=0;n{const{vnode:n,slots:e}=s;let l=!0,p=v;if(32&n.shapeFlag){const s=a._;s?t&&1===s?l=!1:(_(e,a),t||1!==s||delete e._):(l=!a.$stable,Rt(a,e)),p=a}else a&&(Bt(s,a),p={default:1});if(l)for(const c in e)Nt(c)||c in p||delete e[c]})(s,a.children,t),js(),he(void 0,s.update),ms()},M=(s,a,t,n,e,l,p,c,o=!1)=>{const r=s&&s.children,i=s?s.shapeFlag:0,h=a.children,{patchFlag:u,shapeFlag:g}=a;if(u>0){if(128&u)return void V(r,h,t,n,e,l,p,c,o);if(256&u)return void $(r,h,t,n,e,l,p,c,o)}8&g?(16&i&&Z(r,e,l),h!==r&&d(t,h)):16&i?16&g?V(r,h,t,n,e,l,p,c,o):Z(r,e,l,!0):(8&i&&d(t,""),16&g&&P(h,t,n,e,l,p,c,o))},$=(s,a,t,n,e,l,p,c,o)=>{a=a||b;const d=(s=s||b).length,r=a.length,i=Math.min(d,r);let h;for(h=0;hr?Z(s,e,l,!0,!1,i):P(a,t,n,e,l,p,c,o,i)},V=(s,a,t,n,e,l,p,c,o)=>{let d=0;const r=a.length;let i=s.length-1,h=r-1;for(;d<=i&&d<=h;){const n=s[d],r=a[d]=o?Sn(a[d]):kn(a[d]);if(!jn(n,r))break;j(n,r,t,null,e,l,p,c,o),d++}for(;d<=i&&d<=h;){const n=s[i],d=a[h]=o?Sn(a[h]):kn(a[h]);if(!jn(n,d))break;j(n,d,t,null,e,l,p,c,o),i--,h--}if(d>i){if(d<=h){const s=h+1,i=sh)for(;d<=i;)G(s[d],e,l,!0),d++;else{const u=d,g=d,m=new Map;for(d=g;d<=h;d++){const s=a[d]=o?Sn(a[d]):kn(a[d]);null!=s.key&&m.set(s.key,d)}let v,f=0;const y=h-g+1;let q=!1,x=0;const w=new Array(y);for(d=0;d=y){G(n,e,l,!0);continue}let r;if(null!=n.key)r=m.get(n.key);else for(v=g;v<=h;v++)if(0===w[v-g]&&jn(n,a[v])){r=v;break}void 0===r?G(n,e,l,!0):(w[r-g]=d+1,r>=x?x=r:q=!0,j(n,a[r],t,null,e,l,p,c,o),f++)}const _=q?function(s){const a=s.slice(),t=[0];let n,e,l,p,c;const o=s.length;for(n=0;n>1,s[t[c]]0&&(a[n]=t[l-1]),t[l]=n)}}l=t.length,p=t[l-1];for(;l-- >0;)t[l]=p,p=a[p];return t}(w):b;for(v=_.length-1,d=y-1;d>=0;d--){const s=g+d,i=a[s],h=s+1{const{el:p,type:c,transition:o,children:d,shapeFlag:r}=s;if(6&r)return void W(s.component.subTree,a,n,e);if(128&r)return void s.suspense.move(a,n,e);if(64&r)return void c.move(s,a,n,ns);if(c===an){t(p,a,n);for(let s=0;so.enter(p)),l);else{const{leave:s,delayLeave:e,afterLeave:l}=o,c=()=>t(p,a,n),d=()=>{s(p,(()=>{c(),l&&l()}))};e?e(p,c,d):d()}else t(p,a,n)},G=(s,a,t,n=!1,e=!1)=>{const{type:l,props:p,ref:c,children:o,dynamicChildren:d,shapeFlag:r,patchFlag:i,dirs:h}=s;if(null!=c&&Kt(c,null,t,s,!0),256&r)return void a.ctx.deactivate(s);const u=1&r&&h;let g;if((g=p&&p.onVnodeBeforeUnmount)&&Qt(g,a,s),6&r)J(s.component,t,n);else{if(128&r)return void s.suspense.unmount(t,n);u&&$t(s,null,a,"beforeUnmount"),64&r?s.type.remove(s,a,t,e,ns,n):d&&(l!==an||i>0&&64&i)?Z(d,a,t,!1,!0):(l===an&&(128&i||256&i)||!e&&16&r)&&Z(o,a,t),n&&K(s)}((g=p&&p.onVnodeUnmounted)||u)&&Wt((()=>{g&&Qt(g,a,s),u&&$t(s,null,a,"unmounted")}),t)},K=s=>{const{type:a,el:t,anchor:e,transition:l}=s;if(a===an)return void X(t,e);if(a===en)return void w(s);const p=()=>{n(t),l&&!l.persisted&&l.afterLeave&&l.afterLeave()};if(1&s.shapeFlag&&l&&!l.persisted){const{leave:a,delayLeave:n}=l,e=()=>a(t,p);n?n(s.el,p,e):e()}else p()},X=(s,a)=>{let t;for(;s!==a;)t=i(s),n(s),s=t;n(a)},J=(s,a,t)=>{const{bum:n,scope:e,update:l,subTree:p,um:c}=s;n&&Q(n),e.stop(),l&&(l.active=!1,G(p,s,a,t)),c&&Wt(c,a),Wt((()=>{s.isUnmounted=!0}),a),a&&a.pendingBranch&&!a.isUnmounted&&s.asyncDep&&!s.asyncResolved&&s.suspenseId===a.pendingId&&(a.deps--,0===a.deps&&a.resolve())},Z=(s,a,t,n=!1,e=!1,l=0)=>{for(let p=l;p6&s.shapeFlag?as(s.component.subTree):128&s.shapeFlag?s.suspense.next():i(s.anchor||s.el),ts=(s,a,t)=>{null==s?a._vnode&&G(a._vnode,null,null,!0):j(a._vnode||null,s,a,null,null,null,t),ue(),a._vnode=s},ns={p:j,um:G,m:W,r:K,mt:N,mc:P,pc:M,pbc:O,n:as,o:s};let es,ls;a&&([es,ls]=a(ns));return{render:ts,hydrate:es,createApp:Ht(ts,es)}}(s)}function Kt(s,a,t,n,e=!1){if(z(s))return void s.forEach(((s,l)=>Kt(s,a&&(z(a)?a[l]:a),t,n,e)));if(Qa(n)&&!e)return;const l=4&n.shapeFlag?Vn(n.component)||n.component.proxy:n.el,p=e?null:l,{i:c,r:o}=s,d=a&&a.r,r=c.refs===v?c.refs={}:c.refs,i=c.setupState;if(null!=d&&d!==o&&(E(d)?(r[d]=null,C(i,d)&&(i[d]=null)):fa(d)&&(d.value=null)),E(o)){const s=()=>{r[o]=p,C(i,o)&&(i[o]=p)};p?(s.id=-1,Wt(s,t)):s()}else if(fa(o)){const s=()=>{o.value=p};p?(s.id=-1,Wt(s,t)):s()}else O(o)&&Wn(o,c,12,[p,r])}function Qt(s,a,t,n=null){Gn(s,a,7,[t,n])}function Yt(s,a,t=!1){const n=s.children,e=a.children;if(z(n)&&z(e))for(let l=0;l0?pn||b:null,ln.pop(),pn=ln[ln.length-1]||null,on>0&&pn&&pn.push(s),s}function hn(s,a,t,n,e,l){return rn(fn(s,a,t,n,e,l,!0))}function un(s,a,t,n,e){return rn(yn(s,a,t,n,e,!0))}function gn(s){return!!s&&!0===s.__v_isVNode}function jn(s,a){return s.type===a.type&&s.key===a.key}const mn="__vInternal",vn=({key:s})=>null!=s?s:null,bn=({ref:s})=>null!=s?E(s)||fa(s)||O(s)?{i:Ia,r:s}:s:null;function fn(s,a=null,t=null,n=0,e=null,l=(s===an?0:1),p=!1,c=!1){const o={__v_isVNode:!0,__v_skip:!0,type:s,props:a,key:a&&vn(a),ref:a&&bn(a),scopeId:Oa,slotScopeIds:null,children:t,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:l,patchFlag:n,dynamicProps:e,dynamicChildren:null,appContext:null};return c?(Cn(o,t),128&l&&s.normalize(o)):t&&(o.shapeFlag|=E(t)?8:16),on>0&&!p&&pn&&(o.patchFlag>0||6&l)&&32!==o.patchFlag&&pn.push(o),o}const yn=function(s,a=null,t=null,n=0,e=null,l=!1){s&&s!==Jt||(s=nn);if(gn(s)){const n=qn(s,a,!0);return t&&Cn(n,t),n}p=s,O(p)&&"__vccOpts"in p&&(s=s.__vccOpts);var p;if(a){a=function(s){return s?ua(s)||mn in s?_({},s):s:null}(a);let{class:s,style:t}=a;s&&!E(s)&&(a.class=g(s)),T(t)&&(ua(t)&&!z(t)&&(t=_({},t)),a.style=r(t))}const c=E(s)?1:(s=>s.__isSuspense)(s)?128:(s=>s.__isTeleport)(s)?64:T(s)?4:O(s)?2:0;return fn(s,a,t,n,e,c,l,!0)};function qn(s,a,t=!1){const{props:n,ref:e,patchFlag:l,children:p}=s,c=a?function(...s){const a={};for(let t=0;ta(s,t,void 0,l&&l[t])));else{const t=Object.keys(s);e=new Array(t.length);for(let n=0,p=t.length;n!gn(s)||s.type!==nn&&!(s.type===an&&!In(s.children))))?s:null}const On=s=>s?Bn(s)?Vn(s)||s.proxy:On(s.parent):null,En=_(Object.create(null),{$:s=>s,$el:s=>s.vnode.el,$data:s=>s.data,$props:s=>s.props,$attrs:s=>s.attrs,$slots:s=>s.slots,$refs:s=>s.refs,$parent:s=>On(s.parent),$root:s=>On(s.root),$emit:s=>s.emit,$options:s=>qt(s),$forceUpdate:s=>()=>de(s.update),$nextTick:s=>oe.bind(s.proxy),$watch:s=>fe.bind(s)}),Dn={get({_:s},a){const{ctx:t,setupState:n,data:e,props:l,accessCache:p,type:c,appContext:o}=s;let d;if("$"!==a[0]){const c=p[a];if(void 0!==c)switch(c){case 0:return n[a];case 1:return e[a];case 3:return t[a];case 2:return l[a]}else{if(n!==v&&C(n,a))return p[a]=0,n[a];if(e!==v&&C(e,a))return p[a]=1,e[a];if((d=s.propsOptions[0])&&C(d,a))return p[a]=2,l[a];if(t!==v&&C(t,a))return p[a]=3,t[a];vt&&(p[a]=4)}}const r=En[a];let i,h;return r?("$attrs"===a&&vs(s,0,a),r(s)):(i=c.__cssModules)&&(i=i[a])?i:t!==v&&C(t,a)?(p[a]=3,t[a]):(h=o.config.globalProperties,C(h,a)?h[a]:void 0)},set({_:s},a,t){const{data:n,setupState:e,ctx:l}=s;if(e!==v&&C(e,a))e[a]=t;else if(n!==v&&C(n,a))n[a]=t;else if(C(s.props,a))return!1;return("$"!==a[0]||!(a.slice(1)in s))&&(l[a]=t,!0)},has({_:{data:s,setupState:a,accessCache:t,ctx:n,appContext:e,propsOptions:l}},p){let c;return void 0!==t[p]||s!==v&&C(s,p)||a!==v&&C(a,p)||(c=l[0])&&C(c,p)||C(n,p)||C(En,p)||C(e.config.globalProperties,p)}},Tn=Ut();let An=0;let Nn=null;const Fn=()=>Nn||Ia,Ln=s=>{Nn=s,s.scope.on()},Rn=()=>{Nn&&Nn.scope.off(),Nn=null};function Bn(s){return 4&s.vnode.shapeFlag}let Mn=!1;function $n(s,a,t){O(a)?s.render=a:T(a)&&(s.setupState=_a(a)),Un(s)}function Un(s,a,t){const n=s.type;s.render||(s.render=n.render||f),Ln(s),js(),bt(s),ms(),Rn()}function Vn(s){if(s.exposed)return s.exposeProxy||(s.exposeProxy=new Proxy(_a(ja(s.exposed)),{get:(a,t)=>t in a?a[t]:t in En?En[t](s):void 0}))}function Hn(s){return O(s)&&s.displayName||s.name}function Wn(s,a,t,n){let e;try{e=n?s(...n):s()}catch(l){Kn(l,a,t)}return e}function Gn(s,a,t,n){if(O(s)){const e=Wn(s,a,t,n);return e&&A(e)&&e.catch((s=>{Kn(s,a,t)})),e}const e=[];for(let l=0;l>>1;ge(Xn[n])ge(s)-ge(a))),ee=0;eenull==s.id?1/0:s.id;function je(s){Yn=!1,Qn=!0,he(s),Xn.sort(((s,a)=>ge(s)-ge(a)));try{for(Jn=0;Jns.value,r=!!s._shallow):ia(s)?(o=()=>s,n=!0):z(s)?(i=!0,r=s.some(ia),o=()=>s.map((s=>fa(s)?s.value:ia(s)?qe(s):O(s)?Wn(s,c,2):void 0))):o=O(s)?a?()=>Wn(s,c,2):()=>{if(!c||!c.isUnmounted)return d&&d(),Gn(s,c,3,[h])}:f,a&&n){const s=o;o=()=>qe(s())}let h=s=>{d=m.onStop=()=>{Wn(s,c,4)}},u=i?[]:me;const g=()=>{if(m.active)if(a){const s=m.run();(n||r||(i?s.some(((s,a)=>K(s,u[a]))):K(s,u)))&&(d&&d(),Gn(a,c,3,[s,u===me?void 0:u,h]),u=s)}else m.run()};let j;g.allowRecurse=!!a,j="sync"===e?g:"post"===e?()=>Wt(g,c&&c.suspense):()=>{!c||c.isMounted?function(s){ie(s,se,Zn,ae)}(g):g()};const m=new is(o,j);return a?t?g():u=m.run():"post"===e?Wt(m.run.bind(m),c&&c.suspense):m.run(),()=>{m.stop(),c&&c.scope&&k(c.scope.effects,m)}}function fe(s,a,t){const n=this.proxy,e=E(s)?s.includes(".")?ye(n,s):()=>n[s]:s.bind(n,n);let l;O(a)?l=a:(l=a.handler,t=a);const p=Nn;Ln(this);const c=be(e,l.bind(n),t);return p?Ln(p):Rn(),c}function ye(s,a){const t=a.split(".");return()=>{let a=s;for(let s=0;s{qe(s,a)}));else if(L(s))for(const t in s)qe(s[t],a);return s}function xe(s,a,t){const n=arguments.length;return 2===n?T(a)&&!z(a)?gn(a)?yn(s,null,[a]):yn(s,a):yn(s,null,a):(n>3?t=Array.prototype.slice.call(arguments,2):3===n&&gn(t)&&(t=[t]),yn(s,a,t))}const we="3.2.1",_e="undefined"!=typeof document?document:null,ke=new Map,Se={insert:(s,a,t)=>{a.insertBefore(s,t||null)},remove:s=>{const a=s.parentNode;a&&a.removeChild(s)},createElement:(s,a,t,n)=>{const e=a?_e.createElementNS("http://www.w3.org/2000/svg",s):_e.createElement(s,t?{is:t}:void 0);return"select"===s&&n&&null!=n.multiple&&e.setAttribute("multiple",n.multiple),e},createText:s=>_e.createTextNode(s),createComment:s=>_e.createComment(s),setText:(s,a)=>{s.nodeValue=a},setElementText:(s,a)=>{s.textContent=a},parentNode:s=>s.parentNode,nextSibling:s=>s.nextSibling,querySelector:s=>_e.querySelector(s),setScopeId(s,a){s.setAttribute(a,"")},cloneNode(s){const a=s.cloneNode(!0);return"_value"in s&&(a._value=s._value),a},insertStaticContent(s,a,t,n){const e=t?t.previousSibling:a.lastChild;let l=ke.get(s);if(!l){const a=_e.createElement("template");if(a.innerHTML=n?`${s}`:s,l=a.content,n){const s=l.firstChild;for(;s.firstChild;)l.appendChild(s.firstChild);l.removeChild(s)}ke.set(s,l)}return a.insertBefore(l.cloneNode(!0),t),[e?e.nextSibling:a.firstChild,t?t.previousSibling:a.lastChild]}};const Ce=/\s*!important$/;function ze(s,a,t){if(z(t))t.forEach((t=>ze(s,a,t)));else if(a.startsWith("--"))s.setProperty(a,t);else{const n=function(s,a){const t=Ie[a];if(t)return t;let n=U(a);if("filter"!==n&&n in s)return Ie[a]=n;n=W(n);for(let e=0;edocument.createEvent("Event").timeStamp&&(Ee=()=>performance.now());const s=navigator.userAgent.match(/firefox\/(\d+)/i);De=!!(s&&Number(s[1])<=53)}let Te=0;const Ae=Promise.resolve(),Ne=()=>{Te=0};function Fe(s,a,t,n,e=null){const l=s._vei||(s._vei={}),p=l[a];if(n&&p)p.value=n;else{const[t,c]=function(s){let a;if(Le.test(s)){let t;for(a={};t=s.match(Le);)s=s.slice(0,s.length-t[0].length),a[t[0].toLowerCase()]=!0}return[H(s.slice(2)),a]}(a);if(n){!function(s,a,t,n){s.addEventListener(a,t,n)}(s,t,l[a]=function(s,a){const t=s=>{const n=s.timeStamp||Ee();(De||n>=t.attached-1)&&Gn(function(s,a){if(z(a)){const t=s.stopImmediatePropagation;return s.stopImmediatePropagation=()=>{t.call(s),s._stopped=!0},a.map((s=>a=>!a._stopped&&s(a)))}return a}(s,t.value),a,5,[s])};return t.value=s,t.attached=(()=>Te||(Ae.then(Ne),Te=Ee()))(),t}(n,e),c)}else p&&(!function(s,a,t,n){s.removeEventListener(a,t,n)}(s,t,p,c),l[a]=void 0)}}const Le=/(?:Once|Passive|Capture)$/;const Re=/^on[a-z]/;const Be="transition",Me=(s,{slots:a})=>xe(Ma,function(s){const a={};for(const _ in s)_ in $e||(a[_]=s[_]);if(!1===s.css)return a;const{name:t="v",type:n,duration:e,enterFromClass:l=`${t}-enter-from`,enterActiveClass:p=`${t}-enter-active`,enterToClass:c=`${t}-enter-to`,appearFromClass:o=l,appearActiveClass:d=p,appearToClass:r=c,leaveFromClass:i=`${t}-leave-from`,leaveActiveClass:h=`${t}-leave-active`,leaveToClass:u=`${t}-leave-to`}=s,g=function(s){if(null==s)return null;if(T(s))return[He(s.enter),He(s.leave)];{const a=He(s);return[a,a]}}(e),j=g&&g[0],m=g&&g[1],{onBeforeEnter:v,onEnter:b,onEnterCancelled:f,onLeave:y,onLeaveCancelled:q,onBeforeAppear:x=v,onAppear:w=b,onAppearCancelled:k=f}=a,S=(s,a,t)=>{Ge(s,a?r:c),Ge(s,a?d:p),t&&t()},C=(s,a)=>{Ge(s,u),Ge(s,h),a&&a()},z=s=>(a,t)=>{const e=s?w:b,p=()=>S(a,s,t);Ue(e,[a,p]),Ke((()=>{Ge(a,s?o:l),We(a,s?r:c),Ve(e)||Ye(a,n,j,p)}))};return _(a,{onBeforeEnter(s){Ue(v,[s]),We(s,l),We(s,p)},onBeforeAppear(s){Ue(x,[s]),We(s,o),We(s,d)},onEnter:z(!1),onAppear:z(!0),onLeave(s,a){const t=()=>C(s,a);We(s,i),document.body.offsetHeight,We(s,h),Ke((()=>{Ge(s,i),We(s,u),Ve(y)||Ye(s,n,m,t)})),Ue(y,[s,t])},onEnterCancelled(s){S(s,!1),Ue(f,[s])},onAppearCancelled(s){S(s,!0),Ue(k,[s])},onLeaveCancelled(s){C(s),Ue(q,[s])}})}(s),a);Me.displayName="Transition";const $e={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Me.props=_({},Ma.props,$e);const Ue=(s,a=[])=>{z(s)?s.forEach((s=>s(...a))):s&&s(...a)},Ve=s=>!!s&&(z(s)?s.some((s=>s.length>1)):s.length>1);function He(s){return X(s)}function We(s,a){a.split(/\s+/).forEach((a=>a&&s.classList.add(a))),(s._vtc||(s._vtc=new Set)).add(a)}function Ge(s,a){a.split(/\s+/).forEach((a=>a&&s.classList.remove(a)));const{_vtc:t}=s;t&&(t.delete(a),t.size||(s._vtc=void 0))}function Ke(s){requestAnimationFrame((()=>{requestAnimationFrame(s)}))}let Qe=0;function Ye(s,a,t,n){const e=s._endId=++Qe,l=()=>{e===s._endId&&n()};if(t)return setTimeout(l,t);const{type:p,timeout:c,propCount:o}=function(s,a){const t=window.getComputedStyle(s),n=s=>(t[s]||"").split(", "),e=n("transitionDelay"),l=n("transitionDuration"),p=Xe(e,l),c=n("animationDelay"),o=n("animationDuration"),d=Xe(c,o);let r=null,i=0,h=0;a===Be?p>0&&(r=Be,i=p,h=l.length):"animation"===a?d>0&&(r="animation",i=d,h=o.length):(i=Math.max(p,d),r=i>0?p>d?Be:"animation":null,h=r?r===Be?l.length:o.length:0);const u=r===Be&&/\b(transform|all)(,|$)/.test(t.transitionProperty);return{type:r,timeout:i,propCount:h,hasTransform:u}}(s,a);if(!p)return n();const d=p+"end";let r=0;const i=()=>{s.removeEventListener(d,h),l()},h=a=>{a.target===s&&++r>=o&&i()};setTimeout((()=>{rJe(a)+Je(s[t]))))}function Je(s){return 1e3*Number(s.slice(0,-1).replace(",","."))}const Ze={beforeMount(s,{value:a},{transition:t}){s._vod="none"===s.style.display?"":s.style.display,t&&a?t.beforeEnter(s):sl(s,a)},mounted(s,{value:a},{transition:t}){t&&a&&t.enter(s)},updated(s,{value:a,oldValue:t},{transition:n}){!a!=!t&&(n?a?(n.beforeEnter(s),sl(s,!0),n.enter(s)):n.leave(s,(()=>{sl(s,!1)})):sl(s,a))},beforeUnmount(s,{value:a}){sl(s,a)}};function sl(s,a){s.style.display=a?s._vod:"none"}const al=_({patchProp:(s,a,t,n,e=!1,l,p,c,o)=>{"class"===a?function(s,a,t){const n=s._vtc;n&&(a=(a?[a,...n]:[...n]).join(" ")),null==a?s.removeAttribute("class"):t?s.setAttribute("class",a):s.className=a}(s,n,e):"style"===a?function(s,a,t){const n=s.style;if(t)if(E(t)){if(a!==t){const a=n.display;n.cssText=t,"_vod"in s&&(n.display=a)}}else{for(const s in t)ze(n,s,t[s]);if(a&&!E(a))for(const s in a)null==t[s]&&ze(n,s,"")}else s.removeAttribute("style")}(s,t,n):x(a)?w(a)||Fe(s,a,0,n,p):("."===a[0]?(a=a.slice(1),1):"^"===a[0]?(a=a.slice(1),0):function(s,a,t,n){if(n)return"innerHTML"===a||!!(a in s&&Re.test(a)&&O(t));if("spellcheck"===a||"draggable"===a)return!1;if("form"===a)return!1;if("list"===a&&"INPUT"===s.tagName)return!1;if("type"===a&&"TEXTAREA"===s.tagName)return!1;if(Re.test(a)&&E(t))return!1;return a in s}(s,a,n,e))?function(s,a,t,n,e,l,p){if("innerHTML"===a||"textContent"===a)return n&&p(n,e,l),void(s[a]=null==t?"":t);if("value"===a&&"PROGRESS"!==s.tagName){s._value=t;const n=null==t?"":t;return s.value!==n&&(s.value=n),void(null==t&&s.removeAttribute(a))}if(""===t||null==t){const n=typeof s[a];if(""===t&&"boolean"===n)return void(s[a]=!0);if(null==t&&"string"===n)return s[a]="",void s.removeAttribute(a);if("number"===n){try{s[a]=0}catch(c){}return void s.removeAttribute(a)}}try{s[a]=t}catch(o){}}(s,a,n,l,p,c,o):("true-value"===a?s._trueValue=n:"false-value"===a&&(s._falseValue=n),function(s,a,t,n,e){if(n&&a.startsWith("xlink:"))null==t?s.removeAttributeNS(Oe,a.slice(6,a.length)):s.setAttributeNS(Oe,a,t);else{const n=d(a);null==t||n&&!1===t?s.removeAttribute(a):s.setAttribute(a,n?"":t)}}(s,a,n,e))}},Se);let tl;const nl=(...s)=>{const a=(tl||(tl=Gt(al))).createApp(...s),{mount:t}=a;return a.mount=s=>{const n=function(s){if(E(s)){return document.querySelector(s)}return s}(s);if(!n)return;const e=a._component;O(e)||e.render||e.template||(e.template=n.innerHTML),n.innerHTML="";const l=t(n,!1,n instanceof SVGElement);return n instanceof Element&&(n.removeAttribute("v-cloak"),n.setAttribute("data-v-app","")),l},a};var el=(s,a)=>{for(const[t,n]of a)s[t]=n;return s};const ll=["href","innerHTML"],pl=["innerHTML"];var cl=el({name:"VanDocNavLink",props:{base:String,item:Object},computed:{itemName(){const s=(this.item.title||this.item.name).split(" ");return`${s[0]} ${s.slice(1).join(" ")}`},path(){return`${this.base}${this.item.path}`},active(){return this.$route.path===this.path||"home"===this.item.path&&this.$route.path===this.base}},watch:{active(){this.scrollIntoView()}},mounted(){this.scrollIntoView()},methods:{scrollIntoView(){this.active&&this.$el&&this.$el.scrollIntoViewIfNeeded&&this.$el.scrollIntoViewIfNeeded()}}},[["render",function(s,a,t,n,e,l){const p=Xt("router-link");return t.item.path?(cn(),un(p,{key:0,class:g({active:l.active}),to:l.path,innerHTML:l.itemName},null,8,["class","to","innerHTML"])):t.item.link?(cn(),hn("a",{key:1,href:t.item.link,innerHTML:l.itemName},null,8,ll)):(cn(),hn("a",{key:2,innerHTML:l.itemName},null,8,pl))}]]);const ol={name:"VanDocNav",components:{[cl.name]:cl},props:{lang:String,navConfig:Array},data:()=>({top:64,bottom:0}),computed:{style(){return{top:this.top+"px",bottom:this.bottom+"px"}},base(){return this.lang?`/${this.lang}/`:"/"}},created(){window.addEventListener("scroll",this.onScroll),this.onScroll()},methods:{onScroll(){const{pageYOffset:s}=window;this.top=Math.max(0,64-s)}}},dl={class:"van-doc-nav__title"};var rl=el(ol,[["render",function(s,a,t,n,e,l){const p=Xt("van-doc-nav-link");return cn(),hn("div",{class:"van-doc-nav",style:r(l.style)},[(cn(!0),hn(an,null,zn(t.navConfig,((s,a)=>(cn(),hn("div",{class:"van-doc-nav__group",key:a},[fn("div",dl,j(s.title),1),s.items?(cn(!0),hn(an,{key:0},zn(s.items,((s,a)=>(cn(),hn("div",{key:a,class:"van-doc-nav__item"},[yn(p,{item:s,base:l.base},null,8,["item","base"])])))),128)):_n("v-if",!0)])))),128))],4)}]]); +/*! @docsearch/js 3.0.0-alpha.33 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */ +function il(s){return(il="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(s){return typeof s}:function(s){return s&&"function"==typeof Symbol&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s})(s)}function hl(s,a,t){return a in s?Object.defineProperty(s,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):s[a]=t,s}function ul(){return(ul=Object.assign||function(s){for(var a=1;as.length)&&(a=s.length);for(var t=0,n=new Array(a);t3)for(t=[t],l=3;l1&&Wl(e,a,t),a=Ml(t,e,e,s.__k,null,e.__e,a),"function"==typeof s.type&&(s.__d=a)))}function Gl(s,a,t,n,e,l,p,c,o){var d,r,i,h,u,g,j,m,v,b,f,y=a.type;if(void 0!==a.constructor)return null;null!=t.__h&&(o=t.__h,c=a.__e=t.__e,a.__h=null,l=[c]),(d=yl.__b)&&d(a);try{s:if("function"==typeof y){if(m=a.props,v=(d=y.contextType)&&n[d.__c],b=d?v?v.props.value:d.__:n,t.__c?j=(r=a.__c=t.__c).__=r.__E:("prototype"in y&&y.prototype.render?a.__c=r=new y(m,b):(a.__c=r=new Tl(m,b),r.constructor=y,r.render=Xl),v&&v.sub(r),r.props=m,r.state||(r.state={}),r.context=b,r.__n=n,i=r.__d=!0,r.__h=[]),null==r.__s&&(r.__s=r.state),null!=y.getDerivedStateFromProps&&(r.__s==r.state&&(r.__s=Pl({},r.__s)),Pl(r.__s,y.getDerivedStateFromProps(m,r.__s))),h=r.props,u=r.state,i)null==y.getDerivedStateFromProps&&null!=r.componentWillMount&&r.componentWillMount(),null!=r.componentDidMount&&r.__h.push(r.componentDidMount);else{if(null==y.getDerivedStateFromProps&&m!==h&&null!=r.componentWillReceiveProps&&r.componentWillReceiveProps(m,b),!r.__e&&null!=r.shouldComponentUpdate&&!1===r.shouldComponentUpdate(m,r.__s,b)||a.__v===t.__v){r.props=m,r.state=r.__s,a.__v!==t.__v&&(r.__d=!1),r.__v=a,a.__e=t.__e,a.__k=t.__k,r.__h.length&&p.push(r),Wl(a,c,s);break s}null!=r.componentWillUpdate&&r.componentWillUpdate(m,r.__s,b),null!=r.componentDidUpdate&&r.__h.push((function(){r.componentDidUpdate(h,u,g)}))}r.context=b,r.props=m,r.state=r.__s,(d=yl.__r)&&d(a),r.__d=!1,r.__v=a,r.__P=s,d=r.render(r.props,r.state,r.context),r.state=r.__s,null!=r.getChildContext&&(n=Pl(Pl({},n),r.getChildContext())),i||null==r.getSnapshotBeforeUpdate||(g=r.getSnapshotBeforeUpdate(h,u)),f=null!=d&&d.type==Dl&&null==d.key?d.props.children:d,Rl(s,Array.isArray(f)?f:[f],a,t,n,e,l,p,c,o),r.base=a.__e,a.__h=null,r.__h.length&&p.push(r),j&&(r.__E=r.__=null),r.__e=!1}else null==l&&a.__v===t.__v?(a.__k=t.__k,a.__e=t.__e):a.__e=function(s,a,t,n,e,l,p,c){var o,d,r,i,h,u=t.props,g=a.props;if(e="svg"===a.type||e,null!=l)for(o=0;o3)for(t=[t],l=3;l=t.__.length&&t.__.push({}),t.__[s]}function hp(s){return ep=1,up(xp,s)}function up(s,a,t){var n=ip(ap++,2);return n.t=s,n.__c||(n.__=[t?t(a):xp(void 0,a),function(s){var a=n.t(n.__[0],s);n.__[0]!==a&&(n.__=[a,n.__[1]],n.__c.setState({}))}],n.__c=tp),n.__}function gp(s,a){var t=ip(ap++,3);!yl.__s&&qp(t.__H,a)&&(t.__=s,t.__H=a,tp.__H.__h.push(t))}function jp(s,a){var t=ip(ap++,4);!yl.__s&&qp(t.__H,a)&&(t.__=s,t.__H=a,tp.__h.push(t))}function mp(s,a){var t=ip(ap++,7);return qp(t.__H,a)&&(t.__=s(),t.__H=a,t.__h=s),t.__}function vp(){lp.forEach((function(s){if(s.__P)try{s.__H.__h.forEach(fp),s.__H.__h.forEach(yp),s.__H.__h=[]}catch(a){s.__H.__h=[],yl.__e(a,s.__v)}})),lp=[]}yl.__b=function(s){tp=null,pp&&pp(s)},yl.__r=function(s){cp&&cp(s),ap=0;var a=(tp=s.__c).__H;a&&(a.__h.forEach(fp),a.__h.forEach(yp),a.__h=[])},yl.diffed=function(s){op&&op(s);var a=s.__c;a&&a.__H&&a.__H.__h.length&&(1!==lp.push(a)&&np===yl.requestAnimationFrame||((np=yl.requestAnimationFrame)||function(s){var a,t=function(){clearTimeout(n),bp&&cancelAnimationFrame(a),setTimeout(s)},n=setTimeout(t,100);bp&&(a=requestAnimationFrame(t))})(vp)),tp=void 0},yl.__c=function(s,a){a.some((function(s){try{s.__h.forEach(fp),s.__h=s.__h.filter((function(s){return!s.__||yp(s)}))}catch(t){a.some((function(s){s.__h&&(s.__h=[])})),a=[],yl.__e(t,s.__v)}})),dp&&dp(s,a)},yl.unmount=function(s){rp&&rp(s);var a=s.__c;if(a&&a.__H)try{a.__H.__.forEach(fp)}catch(t){yl.__e(t,a.__v)}};var bp="function"==typeof requestAnimationFrame;function fp(s){var a=tp;"function"==typeof s.__c&&s.__c(),tp=a}function yp(s){var a=tp;s.__c=s.__(),tp=a}function qp(s,a){return!s||s.length!==a.length||a.some((function(a,t){return a!==s[t]}))}function xp(s,a){return"function"==typeof a?a(s):a}function wp(s,a){for(var t in a)s[t]=a[t];return s}function _p(s,a){for(var t in s)if("__source"!==t&&!(t in a))return!0;for(var n in a)if("__source"!==n&&s[n]!==a[n])return!0;return!1}function kp(s){this.props=s}(kp.prototype=new Tl).isPureReactComponent=!0,kp.prototype.shouldComponentUpdate=function(s,a){return _p(this.props,s)||_p(this.state,a)};var Sp=yl.__b;yl.__b=function(s){s.type&&s.type.__f&&s.ref&&(s.props.ref=s.ref,s.ref=null),Sp&&Sp(s)};var Cp="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref")||3911,zp=function(s,a){return null==s?null:Bl(Bl(s).map(a))},Pp={map:zp,forEach:zp,count:function(s){return s?Bl(s).length:0},only:function(s){var a=Bl(s);if(1!==a.length)throw"Children.only";return a[0]},toArray:Bl},Ip=yl.__e;function Op(s){return s&&(s.__c&&s.__c.__H&&(s.__c.__H.__.forEach((function(s){"function"==typeof s.__c&&s.__c()})),s.__c.__H=null),(s=wp({},s)).__c=null,s.__k=s.__k&&s.__k.map(Op)),s}function Ep(s){return s&&(s.__v=null,s.__k=s.__k&&s.__k.map(Ep)),s}function Dp(){this.__u=0,this.t=null,this.__b=null}function Tp(s){var a=s.__.__c;return a&&a.__e&&a.__e(s)}function Ap(){this.u=null,this.o=null}yl.__e=function(s,a,t){if(s.then)for(var n,e=a;e=e.__;)if((n=e.__c)&&n.__c)return null==a.__e&&(a.__e=t.__e,a.__k=t.__k),n.__c(s,a);Ip(s,a,t)},(Dp.prototype=new Tl).__c=function(s,a){var t=a.__c,n=this;null==n.t&&(n.t=[]),n.t.push(t);var e=Tp(n.__v),l=!1,p=function(){l||(l=!0,t.componentWillUnmount=t.__c,e?e(c):c())};t.__c=t.componentWillUnmount,t.componentWillUnmount=function(){p(),t.__c&&t.__c()};var c=function(){var s;if(!--n.__u)for(n.__v.__k[0]=Ep(n.state.__e),n.setState({__e:n.__b=null});s=n.t.pop();)s.forceUpdate()};!0===a.__h||n.__u++||n.setState({__e:n.__b=n.__v.__k[0]}),s.then(p,p)},Dp.prototype.componentWillUnmount=function(){this.t=[]},Dp.prototype.render=function(s,a){this.__b&&(this.__v.__k&&(this.__v.__k[0]=Op(this.__b)),this.__b=null);var t=a.__e&&Ol(Dl,null,s.fallback);return t&&(t.__h=null),[Ol(Dl,null,a.__e?null:s.children),t]};var Np=function(s,a,t){if(++t[1]===t[0]&&s.o.delete(a),s.props.revealOrder&&("t"!==s.props.revealOrder[0]||!s.o.size))for(t=s.u;t;){for(;t.length>3;)t.pop()();if(t[1]s.length)&&(a=s.length);for(var t=0,n=new Array(a);t=0||(e[t]=s[t]);return e}(s,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(s);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(s,t)&&(e[t]=s[t])}return e}(s,["translations"]),l=n.buttonText,p=void 0===l?"Search":l,c=n.buttonAriaLabel,o=void 0===c?"Search":c,d=function(s,a){return function(s){if(Array.isArray(s))return s}(s)||function(s,a){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(s)){var t=[],n=!0,e=!1,l=void 0;try{for(var p,c=s[Symbol.iterator]();!(n=(p=c.next()).done)&&(t.push(p.value),!a||t.length!==a);n=!0);}catch(o){e=!0,l=o}finally{try{n||null==c.return||c.return()}finally{if(e)throw l}}return t}}(s,a)||function(s,a){if(s){if("string"==typeof s)return nc(s,a);var t=Object.prototype.toString.call(s).slice(8,-1);return"Object"===t&&s.constructor&&(t=s.constructor.name),"Map"===t||"Set"===t?Array.from(s):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?nc(s,a):void 0}}(s,a)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(hp(null),2),r=d[0],i=d[1];return gp((function(){"undefined"!=typeof navigator&&i(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"⌘":"Ctrl")}),[]),Zp.createElement("button",tc({type:"button",className:"DocSearch DocSearch-Button","aria-label":o},e,{ref:a}),Zp.createElement("span",{className:"DocSearch-Button-Container"},Zp.createElement(ac,null),Zp.createElement("span",{className:"DocSearch-Button-Placeholder"},p)),null!==r&&Zp.createElement("span",{className:"DocSearch-Button-Keys"},Zp.createElement("span",{className:"DocSearch-Button-Key"},"Ctrl"===r?Zp.createElement(sc,null):r),Zp.createElement("span",{className:"DocSearch-Button-Key"},"K")))}));function lc(s,a){var t=Object.keys(s);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(s);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(s,a).enumerable}))),t.push.apply(t,n)}return t}function pc(s,a,t){return a in s?Object.defineProperty(s,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):s[a]=t,s}function cc(s){return s.reduce((function(s,a){return s.concat(a)}),[])}var oc=0;function dc(s){return 0===s.collections.length?0:s.collections.reduce((function(s,a){return s+a.items.length}),0)}function rc(s,a,t,n){if(null===a&&s<0)return t-1;if(null!==n&&0===a&&s<0)return t-1;var e=(null===a?-1:a)+s;return e<=-1||e>=t?null===n?null:0:e}var ic=function(){};function hc(s,a){var t=Object.keys(s);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(s);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(s,a).enumerable}))),t.push.apply(t,n)}return t}function uc(s,a,t){return a in s?Object.defineProperty(s,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):s[a]=t,s}function gc(s){var a,t,n=s.state,e=(t=(a={state:n}.state).collections.map((function(s){return s.items.length})).reduce((function(s,a,t){var n=(s[t-1]||0)+a;return s.push(n),s}),[]).reduce((function(s,t){return t<=a.selectedItemId?s+1:s}),0),a.collections[t]);if(!e)return null;var l=e.items[function(s){for(var a=s.state,t=s.collection,n=!1,e=0,l=0;!1===n;){var p=a.collections[e];if(p===t){n=!0;break}l+=p.items.length,e++}return a.selectedItemId-l}({state:n,collection:e})],p=e.source;return{item:l,itemInputValue:p.getItemInputValue({item:l,state:n}),itemUrl:p.getItemUrl({item:l,state:n}),source:p}}function jc(s,a){return s===a||s.contains&&s.contains(a)}function mc(s,a){var t=Object.keys(s);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(s);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(s,a).enumerable}))),t.push.apply(t,n)}return t}function vc(s){for(var a=1;as.length)&&(a=s.length);for(var t=0,n=new Array(a);t0}},s),{},{id:null!==(a=s.id)&&void 0!==a?a:"autocomplete-".concat(oc++),initialState:xc({selectedItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},s.initialState),plugins:n,onStateChange:function(a){var t;null===(t=s.onStateChange)||void 0===t||t.call(s,a),n.forEach((function(s){var t;null===(t=s.onStateChange)||void 0===t||t.call(s,a)}))},onSubmit:function(a){var t;null===(t=s.onSubmit)||void 0===t||t.call(s,a),n.forEach((function(s){var t;null===(t=s.onSubmit)||void 0===t||t.call(s,a)}))},getSources:function(a){return Promise.all([].concat(function(s){return function(s){if(Array.isArray(s))return yc(s)}(s)||function(s){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(s))return Array.from(s)}(s)||function(s,a){if(s){if("string"==typeof s)return yc(s,a);var t=Object.prototype.toString.call(s).slice(8,-1);return"Object"===t&&s.constructor&&(t=s.constructor.name),"Map"===t||"Set"===t?Array.from(s):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?yc(s,a):void 0}}(s)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(n.map((function(s){return s.getSources}))),[s.getSources]).filter(Boolean).map((function(s){return t=s,n=a,Promise.resolve(t(n)).then((function(s){return Promise.all(s.filter(Boolean).map((function(s){return Promise.resolve(function(s){return function(s){for(var a=1;a=0||(e[t]=s[t]);return e}(s,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(s);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(s,t)&&(e[t]=s[t])}return e}function Oc(s,a){var t=Object.keys(s);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(s);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(s,a).enumerable}))),t.push.apply(t,n)}return t}function Ec(s){for(var a=1;a0});case"blur":return a.props.debug?s:Nc(Nc({},s),{},{isOpen:!1,selectedItemId:null});case"mousemove":return Nc(Nc({},s),{},{selectedItemId:a.payload});case"mouseleave":return Nc(Nc({},s),{},{selectedItemId:a.props.defaultSelectedItemId});default:return s}};function Rc(s){var a,t=_c(s),n=function(s,a){var t=a.initialState;return{getState:function(){return t},send:function(n,e){var l=function(s){for(var a=1;a0)&&Pc({query:a.getState().completion||a.getState().query,event:s,store:a,props:t,setSelectedItemId:n,setQuery:e,setCollections:l,setIsOpen:p,setStatus:c,setContext:o,refresh:d}),a.send("focus",null)}var i="ontouchstart"in t.environment,h=s||{},u=(h.inputElement,h.maxLength),g=void 0===u?512:u,j=Ic(h,["inputElement","maxLength"]);return Ec({"aria-autocomplete":"both","aria-activedescendant":a.getState().isOpen&&null!==a.getState().selectedItemId?"".concat(t.id,"-item-").concat(a.getState().selectedItemId):void 0,"aria-controls":a.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:a.getState().completion||a.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:g,type:"search",onChange:function(s){Pc({query:s.currentTarget.value.slice(0,g),event:s,store:a,props:t,setSelectedItemId:n,setQuery:e,setCollections:l,setIsOpen:p,setStatus:c,setContext:o,refresh:d})},onKeyDown:function(s){!function(s){var a=s.event,t=s.store,n=s.props,e=s.setSelectedItemId,l=s.setQuery,p=s.setCollections,c=s.setIsOpen,o=s.setStatus,d=s.setContext,r=s.refresh;if("ArrowUp"===a.key||"ArrowDown"===a.key){a.preventDefault(),t.send(a.key,null);var i=n.environment.document.getElementById("".concat(n.id,"-item-").concat(t.getState().selectedItemId));i&&(i.scrollIntoViewIfNeeded?i.scrollIntoViewIfNeeded(!1):i.scrollIntoView(!1));var h=gc({state:t.getState()});if(null!==t.getState().selectedItemId&&h){var u=h.item,g=h.itemInputValue,j=h.itemUrl,m=h.source;m.onHighlight({item:u,itemInputValue:g,itemUrl:j,source:m,state:t.getState(),setSelectedItemId:e,setQuery:l,setCollections:p,setIsOpen:c,setStatus:o,setContext:d,event:a})}}else if("Escape"===a.key)a.preventDefault(),t.send(a.key,null);else if("Enter"===a.key){if(null===t.getState().selectedItemId||t.getState().collections.every((function(s){return 0===s.items.length})))return;a.preventDefault();var v=gc({state:t.getState()}),b=v.item,f=v.itemInputValue,y=v.itemUrl,q=v.source;if(a.metaKey||a.ctrlKey)void 0!==y&&(q.onSelect({item:b,itemInputValue:f,itemUrl:y,source:q,state:t.getState(),setSelectedItemId:e,setQuery:l,setCollections:p,setIsOpen:c,setStatus:o,setContext:d,event:a}),n.navigator.navigateNewTab({itemUrl:y,item:b,state:t.getState()}));else if(a.shiftKey)void 0!==y&&(q.onSelect({item:b,itemInputValue:f,itemUrl:y,source:q,state:t.getState(),setSelectedItemId:e,setQuery:l,setCollections:p,setIsOpen:c,setStatus:o,setContext:d,event:a}),n.navigator.navigateNewWindow({itemUrl:y,item:b,state:t.getState()}));else if(a.altKey);else{if(void 0!==y)return q.onSelect({item:b,itemInputValue:f,itemUrl:y,source:q,state:t.getState(),setSelectedItemId:e,setQuery:l,setCollections:p,setIsOpen:c,setStatus:o,setContext:d,event:a}),void n.navigator.navigate({itemUrl:y,item:b,state:t.getState()});Pc({query:f,event:a,store:t,props:n,setSelectedItemId:e,setQuery:l,setCollections:p,setIsOpen:c,setStatus:o,setContext:d,nextState:{isOpen:!1},refresh:r}).then((function(){q.onSelect({item:b,itemInputValue:f,itemUrl:y,source:q,state:t.getState(),setSelectedItemId:e,setQuery:l,setCollections:p,setIsOpen:c,setStatus:o,setContext:d,event:a})}))}}}({event:s,store:a,props:t,setSelectedItemId:n,setQuery:e,setCollections:l,setIsOpen:p,setStatus:c,setContext:o,refresh:d})},onFocus:r,onBlur:function(){i||a.send("blur",null)},onClick:function(n){s.inputElement!==t.environment.document.activeElement||a.getState().isOpen||r(n)}},j)},getPanelProps:function(s){return Ec({onMouseDown:function(s){s.preventDefault()},onMouseLeave:function(){a.send("mouseleave",null)}},s)},getListProps:function(s){return Ec({role:"listbox","aria-labelledby":"".concat(t.id,"-label"),id:"".concat(t.id,"-list")},s)},getItemProps:function(s){var r=s.item,i=s.source,h=Ic(s,["item","source"]);return Ec({id:"".concat(t.id,"-item-").concat(r.__autocomplete_id),role:"option","aria-selected":a.getState().selectedItemId===r.__autocomplete_id,onMouseMove:function(s){if(r.__autocomplete_id!==a.getState().selectedItemId){a.send("mousemove",r.__autocomplete_id);var t=gc({state:a.getState()});if(null!==a.getState().selectedItemId&&t){var d=t.item,i=t.itemInputValue,h=t.itemUrl,u=t.source;u.onHighlight({item:d,itemInputValue:i,itemUrl:h,source:u,state:a.getState(),setSelectedItemId:n,setQuery:e,setCollections:l,setIsOpen:p,setStatus:c,setContext:o,event:s})}}},onMouseDown:function(s){s.preventDefault()},onClick:function(s){var h=i.getItemInputValue({item:r,state:a.getState()}),u=i.getItemUrl({item:r,state:a.getState()});(u?Promise.resolve():Pc({query:h,event:s,store:a,props:t,setSelectedItemId:n,setQuery:e,setCollections:l,setIsOpen:p,setStatus:c,setContext:o,refresh:d,nextState:{isOpen:!1}})).then((function(){i.onSelect({item:r,itemInputValue:h,itemUrl:u,source:i,state:a.getState(),setSelectedItemId:n,setQuery:e,setCollections:l,setIsOpen:p,setStatus:c,setContext:o,event:s})}))}},h)}}}({store:n,props:t,setSelectedItemId:l,setQuery:p,setCollections:c,setIsOpen:o,setStatus:d,setContext:r,refresh:y}),h=i.getEnvironmentProps,u=i.getRootProps,g=i.getFormProps,j=i.getLabelProps,m=i.getInputProps,v=i.getPanelProps,b=i.getListProps,f=i.getItemProps;function y(){return Pc({query:n.getState().query,event:new Event("input"),store:n,props:t,setSelectedItemId:l,setQuery:p,setCollections:c,setIsOpen:o,setStatus:d,setContext:r,nextState:{isOpen:n.getState().isOpen},refresh:y})}return{setSelectedItemId:l,setQuery:p,setCollections:c,setIsOpen:o,setStatus:d,setContext:r,getEnvironmentProps:h,getRootProps:u,getFormProps:g,getInputProps:m,getLabelProps:j,getPanelProps:v,getListProps:b,getItemProps:f,refresh:y}}function Bc(s,a){var t=Object.keys(s);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(s);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(s,a).enumerable}))),t.push.apply(t,n)}return t}function Mc(s){for(var a=1;as.length)&&(a=s.length);for(var t=0,n=new Array(a);t0&&Zp.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},Zp.createElement("p",{className:"DocSearch-Help"},"Try searching for:"),Zp.createElement("ul",null,a.slice(0,3).reduce((function(a,t){return[].concat(function(s){return function(s){if(Array.isArray(s))return lo(s)}(s)||function(s){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(s))return Array.from(s)}(s)||function(s,a){if(s){if("string"==typeof s)return lo(s,a);var t=Object.prototype.toString.call(s).slice(8,-1);return"Object"===t&&s.constructor&&(t=s.constructor.name),"Map"===t||"Set"===t?Array.from(s):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?lo(s,a):void 0}}(s)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(a),[Zp.createElement("li",{key:t},Zp.createElement("button",{className:"DocSearch-Prefill",key:t,onClick:function(){s.setQuery(t.toLowerCase()+" "),s.refresh(),s.inputRef.current.focus()}},t))])}),[]))),Zp.createElement("p",{className:"DocSearch-Help"},"Believe this query should return results?"," ",Zp.createElement("a",{href:"https://github.com/algolia/docsearch-configs/issues/new?template=Missing_results.md&title=[".concat(s.indexName,']+Missing+results+for+query+"').concat(s.state.query,'"'),target:"_blank",rel:"noopener noreferrer"},"Let us know"),"."))}function co(s,a){var t=Object.keys(s);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(s);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(s,a).enumerable}))),t.push.apply(t,n)}return t}function oo(s){for(var a=1;a=0||(e[t]=s[t]);return e}(s,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(s);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(s,t)&&(e[t]=s[t])}return e}(s,["hit","attribute","tagName"])),{},{dangerouslySetInnerHTML:{__html:io(a,"_snippetResult.".concat(t,".value"))||io(a,t)}}))}function uo(s,a){return function(s){if(Array.isArray(s))return s}(s)||function(s,a){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(s)){var t=[],n=!0,e=!1,l=void 0;try{for(var p,c=s[Symbol.iterator]();!(n=(p=c.next()).done)&&(t.push(p.value),!a||t.length!==a);n=!0);}catch(o){e=!0,l=o}finally{try{n||null==c.return||c.return()}finally{if(e)throw l}}return t}}(s,a)||function(s,a){if(s){if("string"==typeof s)return go(s,a);var t=Object.prototype.toString.call(s).slice(8,-1);return"Object"===t&&s.constructor&&(t=s.constructor.name),"Map"===t||"Set"===t?Array.from(s):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?go(s,a):void 0}}(s,a)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function go(s,a){(null==a||a>s.length)&&(a=s.length);for(var t=0,n=new Array(a);t0}));return s.state.query?!1===a?Zp.createElement(po,s):Zp.createElement(fo,s):Zp.createElement(qo,xo({},s,{hasCollections:a}))}),(function(s,a){return"loading"===a.state.status||"stalled"===a.state.status}));function _o(){return(_o=Object.assign||function(s){for(var a=1;a=0||(e[t]=s[t]);return e}(s,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(s);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(s,t)&&(e[t]=s[t])}return e}(a,["_highlightResult","_snippetResult"])),p=l.findIndex((function(s){return s.objectID===t.objectID}));p>-1&&l.splice(p,1),l.unshift(t),l=l.slice(0,n),e.setItem(l)},remove:function(s){l=l.filter((function(a){return a.objectID!==s.objectID})),e.setItem(l)},getAll:function(){return l}}}function Co(s){var a,t="algoliasearch-client-js-".concat(s.key),n=function(){return void 0===a&&(a=s.localStorage||window.localStorage),a},e=function(){return JSON.parse(n().getItem(t)||"{}")};return{get:function(s,a){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){var t=JSON.stringify(s),n=e()[t];return Promise.all([n||a(),void 0!==n])})).then((function(s){var a=ml(s,2),n=a[0],e=a[1];return Promise.all([n,e||t.miss(n)])})).then((function(s){return ml(s,1)[0]}))},set:function(s,a){return Promise.resolve().then((function(){var l=e();return l[JSON.stringify(s)]=a,n().setItem(t,JSON.stringify(l)),a}))},delete:function(s){return Promise.resolve().then((function(){var a=e();delete a[JSON.stringify(s)],n().setItem(t,JSON.stringify(a))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(t)}))}}}function zo(s){var a=vl(s.caches),t=a.shift();return void 0===t?{get:function(s,a){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},n=a();return n.then((function(s){return Promise.all([s,t.miss(s)])})).then((function(s){return ml(s,1)[0]}))},set:function(s,a){return Promise.resolve(a)},delete:function(s){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(s,n){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t.get(s,n,e).catch((function(){return zo({caches:a}).get(s,n,e)}))},set:function(s,n){return t.set(s,n).catch((function(){return zo({caches:a}).set(s,n)}))},delete:function(s){return t.delete(s).catch((function(){return zo({caches:a}).delete(s)}))},clear:function(){return t.clear().catch((function(){return zo({caches:a}).clear()}))}}}function Po(){var s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},a={};return{get:function(t,n){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},l=JSON.stringify(t);if(l in a)return Promise.resolve(s.serializable?JSON.parse(a[l]):a[l]);var p=n(),c=e&&e.miss||function(){return Promise.resolve()};return p.then((function(s){return c(s)})).then((function(){return p}))},set:function(t,n){return a[JSON.stringify(t)]=s.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(s){return delete a[JSON.stringify(s)],Promise.resolve()},clear:function(){return a={},Promise.resolve()}}}function Io(s){for(var a=s.length-1;a>0;a--){var t=Math.floor(Math.random()*(a+1)),n=s[a];s[a]=s[t],s[t]=n}return s}function Oo(s,a){return a?(Object.keys(a).forEach((function(t){s[t]=a[t](s)})),s):s}function Eo(s){for(var a=arguments.length,t=new Array(a>1?a-1:0),n=1;n0?n:void 0,timeout:t.timeout||a,headers:t.headers||{},queryParameters:t.queryParameters||{},cacheable:t.cacheable}}var No={Read:1,Write:2,Any:3};function Fo(s){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return jl(jl({},s),{},{status:a,lastUpdate:Date.now()})}function Lo(s){return"string"==typeof s?{protocol:"https",url:s,accept:No.Any}:{protocol:s.protocol||"https",url:s.url,accept:s.accept||No.Any}}var Ro="POST";function Bo(s,a,t,n){var e,l,p,c=[],o=function(s,a){if("GET"!==s.method&&(void 0!==s.data||void 0!==a.data)){var t=Array.isArray(s.data)?s.data:jl(jl({},s.data),a.data);return JSON.stringify(t)}}(t,n),d=(e=n,l=jl(jl({},s.headers),e.headers),p={},Object.keys(l).forEach((function(s){var a=l[s];p[s.toLowerCase()]=a})),p),r=t.method,i="GET"!==t.method?{}:jl(jl({},t.data),n.data),h=jl(jl(jl({"x-algolia-agent":s.userAgent.value},s.queryParameters),i),n.queryParameters),u=0,g=function a(e,l){var p=e.pop();if(void 0===p)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:Vo(c)};var i={data:o,headers:d,method:r,url:$o(p,t.path,h),connectTimeout:l(u,s.timeouts.connect),responseTimeout:l(u,n.timeout)},g=function(s){var a={request:i,response:s,host:p,triesLeft:e.length};return c.push(a),a},j={onSucess:function(s){return function(s){try{return JSON.parse(s.content)}catch(a){throw{name:"DeserializationError",message:a.message,response:s}}}(s)},onRetry:function(t){var n=g(t);return t.isTimedOut&&u++,Promise.all([s.logger.info("Retryable failure",Ho(n)),s.hostsCache.set(p,Fo(p,t.isTimedOut?3:2))]).then((function(){return a(e,l)}))},onFail:function(s){throw g(s),function(s,a){var t=s.content,n=s.status,e=t;try{e=JSON.parse(t).message}catch(l){}return{name:"ApiError",message:e,status:n,transporterStackTrace:a}}(s,Vo(c))}};return s.requester.send(i).then((function(s){return t=j,e=(n=a=s).status,n.isTimedOut||function(s){var a=s.isTimedOut,t=s.status;return!a&&0==~~t}(n)||2!=~~(e/100)&&4!=~~(e/100)?t.onRetry(a):2==~~(a.status/100)?t.onSucess(a):t.onFail(a);var a,t,n,e}))};return function(s,a){return Promise.all(a.map((function(a){return s.get(a,(function(){return Promise.resolve(Fo(a))}))}))).then((function(s){var t=s.filter((function(s){return 1===(a=s).status||Date.now()-a.lastUpdate>12e4;var a})),n=s.filter((function(s){return 3===(a=s).status&&Date.now()-a.lastUpdate<=12e4;var a})),e=[].concat(vl(t),vl(n));return{getTimeout:function(s,a){return(0===n.length&&0===s?1:n.length+3+s)*a},statelessHosts:e.length>0?e.map((function(s){return Lo(s)})):a}}))}(s.hostsCache,a).then((function(s){return g(vl(s.statelessHosts).reverse(),s.getTimeout)}))}function Mo(s){var a={value:"Algolia for JavaScript (".concat(s,")"),add:function(s){var t="; ".concat(s.segment).concat(void 0!==s.version?" (".concat(s.version,")"):"");return-1===a.value.indexOf(t)&&(a.value="".concat(a.value).concat(t)),a}};return a}function $o(s,a,t){var n=Uo(t),e="".concat(s.protocol,"://").concat(s.url,"/").concat("/"===a.charAt(0)?a.substr(1):a);return n.length&&(e+="?".concat(n)),e}function Uo(s){return Object.keys(s).map((function(a){return Eo("%s=%s",a,(t=s[a],"[object Object]"===Object.prototype.toString.call(t)||"[object Array]"===Object.prototype.toString.call(t)?JSON.stringify(s[a]):s[a]));var t})).join("&")}function Vo(s){return s.map((function(s){return Ho(s)}))}function Ho(s){var a=s.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return jl(jl({},s),{},{request:jl(jl({},s.request),{},{headers:jl(jl({},s.request.headers),a)})})}var Wo=function(s){return function(a){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={transporter:s.transporter,appId:s.appId,indexName:a};return Oo(n,t.methods)}},Go=function(s){return function(a,t){var n=a.map((function(s){return jl(jl({},s),{},{params:Uo(s.params||{})})}));return s.transporter.read({method:Ro,path:"1/indexes/*/queries",data:{requests:n},cacheable:!0},t)}},Ko=function(s){return function(a,t){return Promise.all(a.map((function(a){var n=a.params,e=n.facetName,l=n.facetQuery,p=function(s,a){if(null==s)return{};var t,n,e=function(s,a){if(null==s)return{};var t,n,e={},l=Object.keys(s);for(n=0;n=0||(e[t]=s[t]);return e}(s,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(s);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(s,t)&&(e[t]=s[t])}return e}(n,["facetName","facetQuery"]);return Wo(s)(a.indexName,{methods:{searchForFacetValues:Xo}}).searchForFacetValues(e,l,jl(jl({},t),p))})))}},Qo=function(s){return function(a,t,n){return s.transporter.read({method:Ro,path:Eo("1/answers/%s/prediction",s.indexName),data:{query:a,queryLanguages:t},cacheable:!0},n)}},Yo=function(s){return function(a,t){return s.transporter.read({method:Ro,path:Eo("1/indexes/%s/query",s.indexName),data:{query:a},cacheable:!0},t)}},Xo=function(s){return function(a,t,n){return s.transporter.read({method:Ro,path:Eo("1/indexes/%s/facets/%s/query",s.indexName,a),data:{facetQuery:t},cacheable:!0},n)}};function Jo(s,a,t){return function(s){var a,t,n,e,l=s.appId,p=(a=void 0!==s.authMode?s.authMode:To,t=l,n=s.apiKey,e={"x-algolia-api-key":n,"x-algolia-application-id":t},{headers:function(){return a===To?e:{}},queryParameters:function(){return a===Do?e:{}}}),c=function(s){var a=s.hostsCache,t=s.logger,n=s.requester,e=s.requestsCache,l=s.responsesCache,p=s.timeouts,c=s.userAgent,o=s.hosts,d=s.queryParameters,r={hostsCache:a,logger:t,requester:n,requestsCache:e,responsesCache:l,timeouts:p,userAgent:c,headers:s.headers,queryParameters:d,hosts:o.map((function(s){return Lo(s)})),read:function(s,a){var t=Ao(a,r.timeouts.read),n=function(){return Bo(r,r.hosts.filter((function(s){return 0!=(s.accept&No.Read)})),s,t)};if(!0!==(void 0!==t.cacheable?t.cacheable:s.cacheable))return n();var e={request:s,mappedRequestOptions:t,transporter:{queryParameters:r.queryParameters,headers:r.headers}};return r.responsesCache.get(e,(function(){return r.requestsCache.get(e,(function(){return r.requestsCache.set(e,n()).then((function(s){return Promise.all([r.requestsCache.delete(e),s])}),(function(s){return Promise.all([r.requestsCache.delete(e),Promise.reject(s)])})).then((function(s){var a=ml(s,2);return a[0],a[1]}))}))}),{miss:function(s){return r.responsesCache.set(e,s)}})},write:function(s,a){return Bo(r,r.hosts.filter((function(s){return 0!=(s.accept&No.Write)})),s,Ao(a,r.timeouts.write))}};return r}(jl(jl({hosts:[{url:"".concat(l,"-dsn.algolia.net"),accept:No.Read},{url:"".concat(l,".algolia.net"),accept:No.Write}].concat(Io([{url:"".concat(l,"-1.algolianet.com")},{url:"".concat(l,"-2.algolianet.com")},{url:"".concat(l,"-3.algolianet.com")}]))},s),{},{headers:jl(jl(jl({},p.headers()),{"content-type":"application/x-www-form-urlencoded"}),s.headers),queryParameters:jl(jl({},p.queryParameters()),s.queryParameters)}));return Oo({transporter:c,appId:l,addAlgoliaAgent:function(s,a){c.userAgent.add({segment:s,version:a})},clearCache:function(){return Promise.all([c.requestsCache.clear(),c.responsesCache.clear()]).then((function(){}))}},s.methods)}(jl(jl(jl({},{appId:s,apiKey:a,timeouts:{connect:1,read:2,write:30},requester:{send:function(s){return new Promise((function(a){var t=new XMLHttpRequest;t.open(s.method,s.url,!0),Object.keys(s.headers).forEach((function(a){return t.setRequestHeader(a,s.headers[a])}));var n,e=function(s,n){return setTimeout((function(){t.abort(),a({status:0,content:n,isTimedOut:!0})}),1e3*s)},l=e(s.connectTimeout,"Connection timeout");t.onreadystatechange=function(){t.readyState>t.OPENED&&void 0===n&&(clearTimeout(l),n=e(s.responseTimeout,"Socket timeout"))},t.onerror=function(){0===t.status&&(clearTimeout(l),clearTimeout(n),a({content:t.responseText||"Network request failed",status:t.status,isTimedOut:!1}))},t.onload=function(){clearTimeout(l),clearTimeout(n),a({content:t.responseText,status:t.status,isTimedOut:!1})},t.send(s.data)}))}},logger:(3,{debug:function(s,a){return Promise.resolve()},info:function(s,a){return Promise.resolve()},error:function(s,a){return console.error(s,a),Promise.resolve()}}),responsesCache:Po(),requestsCache:Po({serializable:!1}),hostsCache:zo({caches:[Co({key:"".concat("4.8.1","-").concat(s)}),Po()]}),userAgent:Mo("4.8.1").add({segment:"Browser",version:"lite"}),authMode:Do}),t),{},{methods:{search:Go,searchForFacetValues:Ko,multipleQueries:Go,multipleSearchForFacetValues:Ko,initIndex:function(s){return function(a){return Wo(s)(a,{methods:{search:Yo,searchForFacetValues:Xo,findAnswers:Qo}})}}}}))}function Zo(s,a){return s.reduce((function(s,t){var n=a(t);return s.hasOwnProperty(n)||(s[n]=[]),s[n].length<5&&s[n].push(t),s}),{})}function sd(s){return s}function ad(){}function td(){return(td=Object.assign||function(s){for(var a=1;as.length)&&(a=s.length);for(var t=0,n=new Array(a);t",highlightPostTag:"",hitsPerPage:20},r)}]}).catch((function(s){throw"RetryError"===s.name&&e("error"),s})).then((function(s){var a=s[0].hits,e=s[0].nbHits,l=Zo(a,(function(s){return s.hierarchy.lvl0}));return t.context.searchSuggestions.length0&&(W(),A.current&&A.current.focus())}),[L,W]),Zp.useEffect((function(){function s(){if(E.current){var s=.01*window.innerHeight;E.current.style.setProperty("--docsearch-vh","".concat(s,"px"))}}return s(),window.addEventListener("resize",s),function(){window.removeEventListener("resize",s)}}),[]),Zp.createElement("div",td({ref:O},H({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===P.status&&"DocSearch-Container--Stalled","error"===P.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),onMouseDown:function(s){s.target===s.currentTarget&&h()}}),Zp.createElement("div",{className:"DocSearch-Modal",ref:E},Zp.createElement("header",{className:"DocSearch-SearchBar",ref:D},Zp.createElement(ko,td({},U,{state:P,autoFocus:0===L.length,onClose:h,inputRef:A,isFromSelection:Boolean(L)&&L===F}))),Zp.createElement("div",{className:"DocSearch-Dropdown",ref:T},Zp.createElement(wo,td({},U,{indexName:c,state:P,hitComponent:m,resultsFooterComponent:b,disableUserPersonalization:k,recentSearches:M,favoriteSearches:B,onItemClick:function(s){$(s),h()},inputRef:A}))),Zp.createElement("footer",{className:"DocSearch-Footer"},Zp.createElement(Vc,null))))}function od(){return(od=Object.assign||function(s){for(var a=1;as.length)&&(a=s.length);for(var t=0,n=new Array(a);t{for(var t in a||(a={}))l.call(a,t)&&c(s,t,a[t]);if(e)for(var t of e(a))p.call(a,t)&&c(s,t,a[t]);return s})({},this.searchConfig),s=t(a,n({container:"#docsearch"})),Up(Zp.createElement(id,ul({},s,{transformSearchClient:function(a){return a.addAlgoliaAgent("docsearch.js","3.0.0-alpha.33"),s.transformSearchClient?s.transformSearchClient(a):a}})),function(s){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:window;return"string"==typeof s?a.document.querySelector(s):s}(s.container,s.environment)))}}},[["render",function(s,a,t,n,e,l){return cn(),hn("div",hd)}]]);const gd={class:"van-doc-markdown-body"},jd=wn('

更新日志

v1.9.0

2021-09-27

Bug Fixes

  • Slider: 移除 theme mixin #4520
  • Tab: 修复初始位置不正确问题 #4521

Document

  • ActionSheet: 添加 show 属性说明 #4518

Feature

  • Slider: 添加 vertical 属性 #4486

Performance

  • 移除 CSS variables 兼容代码 #4487

v1.8.7

2021-09-22

Features

  • Icons: 新增 guide-o 图标 #4507

1.8.6

2021-09-20

Features

  • Calendar: 新增 confirmDisabledText 默认文案 #4490) (8629da1

Bug Fixes

1.8.5

2021-09-15

Bug Fixes

  • Calendar: 修复超出选择范围 toast 提示一直存在问题 #4474
  • page-scroll: 修复 isDef 取反问题 #4488

1.8.4

2021-09-07

Bug Fixes

  • page-scroll: 修复 getCurrentPage 为空时报错 #4458

Features

  • Field: 新增 clear-trigger 属性 #4461
  • Search: 新增 clear-icon 属性 #4463
  • Search: 新增 clear-trigger 属性 9e17b13
  • Slider: 新增 range 属性 #4442

v1.8.3

2021-08-30

Bug Fixes

  • Calendar: 修复 default-date 属性失效问题 #4430
  • ShareSheet: 调整 overlayStyle 属性类型为 string 8c408e2
  • Stepper: 调整 minus/plus slots 位置 #4427
  • Sticky: 修复 root 为 null 时,读取 root.top 报错问题 #4433
  • Calendar: 调整 minDate 和 maxDate 传值类型为 Number 37d8e69

Features

  • Popup: 新增 lock-scroll 属性 #4384

Performance Improvements

  • Radio: label 的 margin-left 改为 padding-left,增大可点击区域,增强用户体验 #4165

v1.8.2

2021-08-18

Bug Fixes

  • Calendar: 修复 template 引用路径不是相对路径的问题 7f7cf6
  • Field: 修复 template 引用路径不是相对路径的问题 6dd42a

v1.8.1

2021-08-18

Feature

  • Calendar: 新增 click-subtitle 事件 #4385
  • Circle: 使用 setTimeout 代替 setInterval #4401

Bug Fixes

  • Picker: 修复 template 引用路径不是相对路径的问题 #4408

v1.8.0

2021-08-11

Feature

  • Overlay: 新增 lock-scroll 属性 #4383
  • search: 新增 click-input 事件 #4357

Performance

  • 移除了 iOS8 相关的 polyfill,减少包体积 #4395

v1.7.2

2021-07-19

Bug Fixes

  • Calendar: 初始日期设置为当前日期 #4339

Features

  • Cell: CellGroup 新增 inset 属性 #4341
  • Search: 新增 click-input 事件 #4337

1.7.1

2021-07-06

Bug Fixes

  • Col: 修复样式问题 #4322
  • Grid: 增加 icon-prefix 属性默认值 #4318
  • IndexBar: 修复当索引列表为空时报错 #4310

1.7.0

2021-07-04

Bug Fixes

  • Button: 修复 type 为 getUserInfo & wx.getUserProfile 可用时 lang 参数失效 #4250
  • ShareSheet: 新增内置 icon weapp-qrcode wechat-moments #4256

Features

  • Checkbox: 增加 direction 属性,设置排列方向 #4265
  • ConfigProvider: 增加全局配置组件 #4279
  • Grid: 增加 reverse 属性,支持文本&图片位置互换 #4280
  • GridItem: 增加 icon-prefix 属性,支持第三方字体 #4276
  • Rate: 增加更多 css 变量 #4297
  • Slider: 增加更多 css 变量 #4305

Improvements

  • wxs style 方法支持驼峰变量命名,以便能更好的在 wxml 中使用 #4281

1.6.9

2021-06-06

Bug Fixes

  • DatetimePicker: 修复 动态设置 min-hour min-date 显示不正确 #4245
  • Tabs: 修复 tab 数量较多时滚动距离不正确 #4202
  • Uploader: 修复 demo 中 beforeRead 报错 #4235

1.6.9-beta.2

2021-05-22

Bug Fixes

  • Button: 修复 open-type 不生效 #4222
  • Calendar: 修复 allow-same-day 开启时 custom-color 属性无效 #4200
  • Circle: 修复 value 是小数时抖动的情况 #4152
  • NoticeBar: 调整滚动行为 #4201
  • NoticeBar: 修复不正确的滚动速度 cde3876
  • Radio: 支持动态设置 disabled #4191
  • Rate: 支持滑动选择半星 #4195

Features

  • Calendar: 增加 first-day-of-week 属性,设置周起始日 #4211
  • Calendar: 增加 show-range-prompt 属性和 over-range 事件,设置是否展示提示文案 #4212
  • Icons: 图标库迁移至 iconfont.cn #4219
  • OpenType: 支持 getUserProfile #4203
  • Panel: 移除 useFooterSlot #4205

1.6.8

2021-02-26

Features

  • NoticeBar: 新增默认插槽 (#4048)
  • Stepper: 新增 theme 属性,支持圆形风格 (#4049)
  • Stepper: 新增 plus & minus 插槽 (#4049)

Bug Fixes

  • Checkbox: 修复 label-position 属性无效 (#4036)
  • Dialog: 修复 beforeClose 方法类型定义 (#4019)

Improvements

  • Circle: 当内置 canvas 不支持同层渲染时降级至默认 type (#4050)

1.6.7

2021-01-27

Features

  • Radio: 新增 direction 属性 (#4007)

Bug Fixes

  • Icons: 修复部分地区图标不显示 (#4012)
  • Transition: 修复默认设置 show 属性为 true 时不生效 (#4005)

1.6.6

2021-01-21

Features

  • Uploader: 支持文件预览 (#3975)

Bug Fixes

  • Picker: 修复标题栏无法显示 (#3973)

Improvements

  • Calendar: 优化模板代码 (#3972)

1.6.5

2021-01-19

Features

  • Field: 新增 input 插槽 (#3932)
  • Field: 新增 click-input 事件 (#3932)
  • Icon: 新增 delete-o、sort、font、font-o、revoke 图标 (#3881)

Bug Fixes

  • Button: 修复 custom-style 属性不生效 (#3903)
  • Dialog: 修复 close-on-click-overlay 属性不生效 (#3913)

Improvements

  • Cell: 优化性能 (#3888)
  • Col: 优化性能 (#3886)
  • Divider: 优化性能 (#3887)
  • Empty: 优化性能 (#3933)
  • Loading: 优化性能 (#3892)
  • Notice-bar: 优化性能 (#3891)
  • Notify: 优化性能 (#3893)
  • Picker: 优化性能 (#3949)
  • Stepper: 优化性能 (#3890)
  • Sticky: 优化性能 (#3879)
  • SwipeCell: 优化性能 (#3928)
  • Switch: 优化性能 (#3889)
  • Tag: 优化性能 (#3894)
  • Transition: 优化性能 (#3895)
  • Uploader: 优化性能 (#3897)

1.6.4

2020-12-18

Improvements

  • Tab: 优化粘性布局时的渲染性能 (#3875)
  • Grid: 使用 wxs 优化性能 (#3839)
  • Image: 使用 wxs 优化性能 (#3839)
  • Button: 使用 wxs 优化性能 (#3839)
  • Icon: 减少代码体积 (#3839)
  • Checkbox: 减少代码体积 (#3839)
  • Slider: 减少代码体积 (#3839)

Bug Fixes

  • Calendar: 修复在 phone 设备上选择日期后显示错误 (#3833)
  • GoodsAction: 修复部分设备上高度异常 (#3865)
  • Slider: 修复设置 max min 时滑动不均匀 (#3876)
  • Tab: 修复切换时内容区闪烁的问题 (#3866)

1.6.3

2020-12-09

Features

  • Dialog: 新增 beforeClose 属性 (#3815)
  • uploader: 新增若干 CSS 变量 (#3797)
  • Aarea: 支持不传入 county_list 数据 (#3824)
  • Tab: 新增 resize 方法 (#3827)

Improvements

  • Collapse: 使用 animate 提升动画性能 (#3826)
  • Tab: 优化样式拼装性能 (#3827)

Bug Fixes

  • Field: 修复输入中文时显示字数暂时超出 maxlength (#3802)
  • Info: 修复样式错误 (#3823)
  • NavBar: 修复动态渲染时组件报错 (#3822)
  • Progress: 修复 percentage 为 0 时样式异常 (#3808)

1.6.2

2020-11-29

Features

  • Tabbar: 新增 placeholder icon-prefix 属性 (#3792)

Bug Fixes

  • DatetimePicker: 修复 type=year-month 时选择出现报错 (#3783)
  • Info: 修复部分安卓设备中文案不完全居中 (#3778)
  • Tab: 修复 ellipsisfalse 时下划线位置不正确 (#3777)
  • Notify: 修复组件未全局居中 (#3751)

Improvements

  • Icon: 使用 wxs 优化性能 (#3791)

1.6.1

2020-11-12

Bug Fixes

  • Field: 修复未传入 label 属性时仍渲染 label #3756
  • Picker: 修复 confirm、cancel 事件报错 #3755

1.6.0

2020-11-11

Features

  • SwipeCell: 新增外部样式类 custom-class #3678
  • ActionSheet: 调整取消文字颜色至 @gray-7 #3719
  • ActionSheet: 调整顶部栏样式 #3720
  • ActionSheet: 调整加载图标大小至 22px #3718
  • ActionSheet: 调整描述文字样式 #3726
  • Cell: 调整图标外边距至 4px #3721
  • DropdownMenu: 增加默认阴影 #3723
  • DropdownMenu: 调整选中态默认颜色至 #ee0a24 #3725
  • Image: 调整图标大小至 36px #3724
  • Popup: 调整圆角至 16px #3713
  • Search: 调整左侧内边距至 12px #3716
  • Sidebar: 调整宽度至 85px #3722
  • TabbarItem: 调整图标大小至 22px #3717

Bug Fixes

  • Field: 修复使用 label 属性时 label-class 样式类不生效 #3729
  • NoticeBar: 修复内容较短时开启 scrollable 不生效 #3727
  • SidebarItem: 修复长数字不换行的问题 #3714
  • Tag: 默认字体加入 miui #3715

1.5.2

2020-10-15

Features

  • Uploader: 标准化 file-list 与事件参数 #3673
  • Uploader: 新增 thumb,支持缩略图展示 #3673
  • GoodsAction: 新增若干 CSS 变量 #3654
  • 移动 @types/wechat-miniprogram 至 dependencies #3654

Bug Fixes

  • Button: 修复细边框样式问题 #3653
  • Tab: 重构动画实现,不再使用 transform #3668

1.5.1

2020-09-29

Features

  • Card: 新增 origin-price tag 插槽 #3645
  • ShareSheet: 调整默认 z-index 至 100 #3575
  • ShareSheet: 新增 item 属性 openType #3575
  • Uploader: 扩大删除按钮点击区域 #3631

Bug Fixes

  • Uploader: 支持预览视频 #3594
  • Dialog: 调整类型定义 #3630
  • NavBar: 修复 CSS 变量 --nav-bar-icon-color 不生效 #3643
  • NavBar: 修复未设置 title 时样式异常 #3643
  • Tab: 修复 line-width 属性不支持 string #3628

1.5.0

2020-08-27

Features

  • ShareSheet: 新增组件 #3559
  • Icons: 升级 @vant/icons 至 v1.2.5 #3539
  • sidebar: 新增 badge 属性 #3564
  • Tabs: 调整默认 line-width 至 40px #3518
  • Tabs: 去除默认边框 #3519
  • TreeSelect: 新增 selected-icon 属性 #3565
  • TreeSelect: 支持 badge、dot 显示 #3565

Bug Fixes

  • collapse: 修复嵌套在 popup 等组件中时默认展开无效 #3562
  • empty: 修复 image、description 插槽不生效 #3563

1.4.4

2020-08-12

Bug Fixes

  • Transition: 重构组件以修复卡顿问题 #3498
  • Icon: 修复数字未对齐 #3501
  • Tab: 修复可滚动时下划线位置错误 #3511

v1.4.3

2020-08-07

Features

  • Dialog: 增加圆角按钮样式 #3476
  • Cell: 调整下划线位置 #3487
  • Tab: 调整默认滚动阈值至 5 个、优化样式 #3459

v1.4.2

2020-08-03

Features

Bug Fixes

  • Calendar: 修复超出 max-range 时未显示 Toast #3466
  • Tab: 修复手势滚动可切换至禁用项 #3467

v1.4.1

2020-07-28

Features

  • Picker: 调整默认可见的选项个数为 6 个 #3418
  • Toast: 调整圆角为 8px #3419

Bug Fixes

  • Slider: 修复点击会触发 drag 事件 #3415
  • Area: 修复中间列无法滚动 #3443

v1.4.0

2020-07-17

Features

  • Empty: 新增 Empty 组件 #3327
  • NoticeBar: 新增 background 属性 #3388
  • NoticeBar: 新增 close 事件 #3388
  • GridItem: 新增 icon-color 属性 #3386
  • NavBar: 现在 custom-style 将影响根节点#3371
  • Cell: 新增 title-style 属性, fix Field label width #3370
  • Uploader: 更新 failed 图标 #3359
  • Uploader: 更新删除图标样式 #3385
  • Uploader: 移除圆角样式 #3384
  • Field: 更新禁用态样式 #3358
  • Field: 更新 label 样式 #3357
  • Picker: 调整 action button 样式 #3316

Bug Fixes

  • Collapse: 使用 animation 重构动画部分逻辑以修复动画卡顿 #3401
  • Uploader: 修复 loading 样式错误、调整 previewSize 属性默认值 #3317
  • Area: 修复低版本基础库下 columns-num 设置为 1 或 2 时真机环境报错 #3318
  • DatetimePicker: 修复使用 formatter 时,事件返回值可能不正确 #3352
  • Field: 修复 textarea 模式下 label 与 value 不在同一水平线上 #3383
  • Dialog: show dialog after class ready #3374
  • Calendar: confirm-disabled-text 属性增加默认值 #3394

v1.3.3

2020-06-24

Features

  • steps: 为每一项增加 inactiveIcon、activeIcon 属性 #3315
  • field: 增加外部样式类 label-class #3311
  • field: 现在总会从内部 set value 值 #3313
  • uploader: 为每一项增加 deletable 属性 #3270
  • uploader: 扩大删除图标的可点击区域 #3265

Bug Fixes

  • tabbar: 修复 iphone-se 上高度异常 #3314
  • grid: 修复 text 与 icon 同时设置时样式异常 #3310
  • calendar: 修复多选模式下 default-date 属性不生效 #3284
  • circle: 修复 type=“2d” 时无法动态变更 value #3264
  • nav-bar: 修复未设置 left-text 时左侧图标样式异常 #3263

v1.3.2

2020-06-04

Features

  • button: 新增 form-type 属性 #3208
  • grid: 新增 icon-size、badge 属性 #3236
  • grid: 新增 direction 属性 #3192

Bug Fixes

  • Grid: 修复开启 square 时横、纵向间距不同 #3231
  • uploader: 修复点击删除图标时触发 click-preview 事件 #3230
  • circle: 修复 type="2d" 不生效 #3228
  • calendar: 修复在选择区间时,点击确定报错 #3195
  • tag: 修复 css 变量名拼写错误 #3191

v1.3.1

2020-05-24

Features

  • Button: 新增 class-prefix 属性 #3159
  • Collapse: 新增 open、close 事件 #3176

Bug Fixes

  • 修复控制台提示选择器错误的问题 #3137
  • 修复 GoodsActionButton 在某些情况下报错的问题 #3145

v1.3.0

2020-05-08

支持简易双向绑定

1.3.0 中,我们为数个表单组件支持了简易双向绑定,涉及组件有

Slider #3107

Search #3106

Rate #3105

Features

  • sticky: 新增 scroll-top 属性 #3115
  • button: 新增 dataset 属性 #3075
  • uploader: 所有类型都会触发 click-preview 事件 #3071
  • Uploader: 属性 accept 新增值 media #3047
  • feat: 新增基础 font-family #3061
  • submit-bar: 使用另一个 view 实现 safe-area-inset-bottom 以避免样式冲突 #3104

Bug Fixes

  • dialog: 修复 title 多余空格的问题 #3069
  • tab: 修复 tab 个数多时显示滚动条 #3072
  • Sticky: 修复使用组件时页面 onPageScroll 失效 #3092
  • button: 修复 disabled 属性对 open-type 类型的按钮无效 #3076

v1.2.2

2020-04-21

Features

  • GoodsActionButton: 新增 CSS 变量 goods-action-line-height #3037
  • Calendar: 选择区间大于 range 时自动选中最大范围 #3026
  • Notify: 新增 top 属性 #3018

Bug Fixes

  • Field: 修复未设置 autosize 时 wxs 报错 #3038
  • Field: 避免设置 showClear 为 undefined #3012

v1.2.1

2020-04-12

Features

  • Field: 支持小程序双向绑定 #2986
  • Calendar: 多选模式下新增 unselect 事件 #2990

Bug Fixes

  • IndexBar: 移除 scroll-top 属性 #2999
  • Uploader: 修复图片后缀名为大写时未正常识别 #2987
  • Field: 修复 autosize 属性 设置 max-height 不生效 #3007

v1.2.0

2020-04-04

Features

  • TreeSelect: 更新 nav 背景色 #2952
  • Sticky: 使用 page scroll 重构组件 #2950
  • Field: 新增 auto-focus、disable-default-padding、cursor 属性 #2936
  • Field: 新增 linechange、keyboardheightchange 事件 #2936
  • Uploader: 支持显示上传状态 #2929
  • Image: mode 属性新增 widthFix、heightFix #2908
  • Canvas: 新增 type 属性 #2906
  • NavBar: 新增 placeholder 属性 #2896

Bug Fixes

  • Field: 修复输入过快时输入框内容不断回退 #2936
  • Calendar: 修复 show-confirm 为 true 时组件初始化报错 #2951
  • Tab: 修复 type 为 card 时 color 对边框无效 #2941

v1.1.0

2020-03-21

Features

  • 新增 Calendar 日历组件 #2894
  • Grid: 新增外部样式类 custom-class、content-class、icon-class、text-class #2882
  • Steps: 新增 click 事件 #2874
  • SideBar: 新增 title 插槽 #2873
  • Uploader: 新增 upload-icon 属性 #2869
  • Uploader: 新增 show-upload 属性 #2868
  • Uploader: 更新样式、调整事件触发顺序与 vant 一致 #2886
  • Field: 新增 show-word-limit 属性 #2856
  • Field: autosize 属性支持传入对象,指定 maxHeight 与 minHeight #2856
  • Field: 新增若干 CSS 变量 #2856

Bug Fixes

  • Button: 移除 lang 属性默认值 #2883
  • Button: 修复 disabled 属性对原生事件无效 #2878

v1.0.7

2020-03-04

Features

  • DropdownItem: 新增 popupStyle 属性 #2804
  • DropdownItem: 新增 open close opened closed 事件 #2804
  • Card: 新增 price num 插槽 #2787
  • Card: 新增 origin-price-class 外部样式类 #2787

Bug Fixes

  • Tab: 修复内容项高度不同时粘性布局异常 #2817
  • Picker: 修复未选中项样式未置灰 #2816
  • GoodsActionButton: 修复仅使用一个 button 时样式异常 #2808
  • Radio: name类型与value统一 #2801
  • Uploader: 修复文档错误 #2777

v1.0.6

2020-02-24

Features

  • GoodsActionButton: 新增默认 slot #2779
  • SubmitBar: 更新圆角样式 #2755
  • Card: 更新样式 #2754
  • 优化 relation 部分代码 #2760

Bug Fixes

  • DropdownItem: 修复点击选项时不触发close事件 #2766
  • GoodsActionButton: 修复低版本基础库下的样式问题 #2762
  • Tabs: 修复点击禁用项时事件参数错误 #2758
  • Checkbox: 修复动态设置disabled属性无效 #2748
  • Button: add loading color when plain is true #2746
  • Radio: 修复label-disabled文档错误 #2763

v1.0.5

2020-02-07

Features

  • ActionSheet: actions 支持更多 openType #2715
  • Uploader: 新增开始disabled时的组件样式 #2720
  • Icon: 调整示例小程序页面与 vant 对齐 #2728
  • 示例小程序首页与 vant 对齐 #2729
  • 完善快速上手文档,增加 npm 构建说明 #2726

Bug Fixes

  • Radio: 修复disabled属性不生效 #2711
  • Tab: 修复animated属性无法动态切换 #2712
  • Circle: 修正文档错误,size属性不支持string类型 #2694
  • 修正文档默认 slot 名称为 default 的错误 #2726
  • TreeSelect: 修正文档示例代码标签闭合错误 #2710

v1.0.4

2020-01-21

Features

  • Stepper: 新增 disable-long-press 属性 #2691
  • quickstart: 快速上手新增关闭 style v2 说明 #2704
  • Search: 新增 background、disabled、input-align 文档示例 #2698
  • Icon: 文档新增图标文字加载失败说明 #2681

Bug Fixes

  • Sticky: 修复真机上页面滚动缓慢时无法吸顶/取消吸顶 #2703
  • DropdownItem: 修复 wx:key 警告 #2670
  • IndexBar: 文档修复组件引入路径错误 #2689
  • 升级依赖版本以避免安全警告 #2680

v1.0.3

2020-01-09

Features

  • npm 包默认输出 es5 版本代码 #2639
  • Steps: 新增外部样式类 desc-class #2630

Bug Fixes

  • Tab: 解决动态添加选项时,顺序错乱和下划线长度不变的问题 #2663
  • NavBar: 修复返回图标未居中的问题 #2633

v1.0.2

2019-12-31

Features

  • Skeleton: 新增外部样式类row-class``avatar-class``title-class #2612
  • SwipeCell: 支持动态修改width属性 #2607
  • Uploader: 新增camera``compressed``maxDuration属性 #2584

Improvements

  • Tab: 优化弹性滚动效果 #2606

Bug Fixes

  • IndexBar: 修复字母未全部定义时 click 事件报错 #2605
  • Field: 修复点击清除图标后下一次点击无效 #2602

v1.0.1

2019-12-23

Features

  • Uploader: 新增 sizeType 属性 #2563
  • GoodsActionButton: 新增 plain 属性 #2559
  • Uploader: 去除 use-slot 属性 #2551
  • 新增样式覆盖说明文档 #2566

Improvements

  • 使用 nextTick 优化部分异步逻辑 #2561
  • wxs 新增 addUnit 方法以减少 setData 调用次数 #2550

Bug Fixes

  • Tag: 修复未依赖 van-icon 组件 #2579
  • Notify: 修复 safeAreaInsetTop 不生效 #2558
  • Uploader: 修复 capture 属性不生效 #2551

v1.0.0

2019-12-11

主要变动

  • npm 包名由 vant-weapp 重命名为 @vant/weapp
  • 增加十一个新组件
  • 增加数十个 API
  • 所有组件支持通过CSS自定义属性自定义样式
  • 使用env()重构 iOS 安全区域适配
  • 调整部分 API 命名,废除少量 API

新组件

在 Vant Weapp 1.0 版本中,我们新增了 11 个实用的基础组件:

  • Grid 宫格,用于展示内容或进行页面导航
  • Image 图片,增强版的 Image 标签,支持图片懒加载与加载失败提示
  • Circle 环形进度条,告知用户当前的状态和进度
  • Overaly 遮罩层,用于强调特定的页面元素,并阻止用户进行其他操作
  • Divider 分割线,区隔内容的分割线
  • Sticky 粘性布局,与 CSS 中position: sticky属性实现的效果类似
  • Skeleton 骨架屏,在待加载区域展示的占位区块,提供界面加载过程中的过渡效果
  • IndexBar 索引栏,通讯录中的字母索引栏,用于长列表快速索引
  • Uploader 文件上传,上传一个或多个文件
  • CountDown 倒计时,用于显示活动倒计时、短信验证码等
  • DropdownMenu 下拉菜单,用于列表的分类选择、筛选及排序

样式定制

在 1.0 迭代计划确定之初,我们就不断思考这样一个问题 – 该如何给用户提供动态切换主题样式的功能呢?

微信小程序的环境是非常特殊的。不具有动态加载代码的机制,同时微信又限制了代码的主包大小和总大小。传统的基于预设的样式定制过于臃肿,不再适合微信小程序的环境。

微信小程序自定义组件的组件模型相当于一个简化版的 Shadow DOM,幸运的是,小程序也支持了 CSS 自定义属性 的特性。最终,我们基于 CSS 自定义属性设计了样式定制的方案,开发者使用灵活、方便,组件维护也更简单。

从 1.0 版本开始,Vant Weapp 中的所有组件都支持通过 CSS 组定义属性 进行样式定制,具体使用姿势可查看相关文档

定制主题

不兼容更新

1.0 版本中包含少量不兼容更新,主要是命名调整和移除个别属性。对于正在使用 0.x 版本的项目,请按照下方的列表依次检查,大部分项目可以无痛升级

Badge
  • BadgeGroup重命名为Sidebar
  • Badge重命名为SlidebarItem
  • active属性重命名为activeKey
Notify
  • text选项重命名为message
  • backgroundColor选项重命名为background
  • 去除transitionend事件,新增 6 个事件
SwitchCell
  • 移除了SwitchCell组件,可以使用CellSwitch组件代替
Transition
  • 去除transitionend事件,新增 6 个事件

新特性

ActionSheet
  • 新增click-overlay事件
  • 新增close-on-click-action属性
  • 新增color属性
  • 新增description属性
  • 新增round属性
Area
  • 新增columns-placeholder属性
  • reset方法支持传入code参数
Button
  • 新增loading-type属性
  • color属性支持渐变色
  • 切换disabled时增加过渡效果
Checkbox
  • 新增icon-size属性
Color
  • 基础红色更新为#ee0a24
DatetimePicker
  • 新增filter属性
Dialog
  • 优化文字换行
  • 新增title插槽
  • 新增confirm-button-color属性
  • 新增cancel-button-color属性
  • 新增width属性
  • 新增overlay-style属性
Field
  • 新增clickable属性
  • 新增arrow-direction属性
  • 新增hold-keyboard属性
GoodsActionButton
  • 新增color属性
  • 样式升级为圆角风格
GoodsActionIcon
  • 新增icon插槽
  • 新增dot属性
GridItem
  • 新增info属性
  • 新增dot属性
Icon
  • 新增dot属性
  • 新增down图标
  • 新增wap-hone实底风格图标
  • 支持number类型的size属性
Loading
  • 支持number类型的size属性
NoticeBar
  • 阻止关闭图标点击事件冒泡
Notify
  • 新增clear方法
  • 新增round属性
  • 新增closeable属性
  • 新增close-icon属性
  • 新增close-icon-position属性
Progress
  • 新增stroke-width属性
Radio
  • 新增icon-size属性
Rate
  • 优化手势判断
  • 新增gutter属性
  • 新增touchable属性
  • 支持string类型的size属性
  • 新增action-text属性
  • 新增left-icon插槽
  • 新增right-icon插槽
SlidebarItem
  • 新增dot属性
Slider
  • 新增drag-start事件
  • 新增drag-end事件
  • 支持传入任意范围的maxmin属性
  • 支持number类型的bar-height属性
  • 增加滑动动画
  • 增大点击区域
SwipeCell
  • 新增name属性
  • 新增open事件
  • 支持打开状态互斥
Switch
  • 加载图标的颜色会跟随开关状态变化
Stepper
  • 支持长按手势
  • 新增input-width属性
  • 新增button-size属性
  • 新增decimalLength属性
  • 新增 disablePlus、disableMinus 属性
Steps
  • 新增active-icon属性
  • 新增inactive-icon属性
Tabs
  • 使用 Sticky 组件重构吸顶实现
  • 新增name属性
  • 新增line-height属性
  • 新增ellipsis属性
  • 新增lazy-render属性
  • line-width属性支持String类型
  • 增加云开发结合示例
TreeSelect
  • 新增max属性
  • 新增content插槽
',48),md=[jd],vd={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",gd,md)))},bd={class:"van-doc-markdown-body"},fd=wn('

样式覆盖

介绍

Vant Weapp 基于微信小程序的机制,为开发者提供了以下 3 种修改组件样式的方法

解除样式隔离

样式隔离的相关背景知识请查阅微信小程序文档


Vant Weapp 的所有组件都开启了addGlobalClass: true以接受外部样式的影响,可以使用如下 2 种方式覆盖组件样式

在页面中使用 Vant Weapp 组件时,可直接在页面的样式文件中覆盖样式

<van-button type="primary">主要按钮</van-button>\n
/* page.wxss */\n.van-button--primary {\n  font-size: 20px;\n  background-color: pink;\n}\n

在自定义组件中使用 Vant Weapp 组件时,需开启styleIsolation: 'shared'选项

<van-button type="primary">主要按钮</van-button>\n
Component({\n  options: {\n    styleIsolation: 'shared',\n  },\n});\n
.van-button--primary {\n  font-size: 20px;\n  background-color: pink;\n}\n

使用外部样式类

外部样式类的相关知识背景请查阅微信小程序文档


Vant Weapp 开放了大量的外部样式类供开发者使用,具体的样式类名称可查阅对应组件的“外部样式类”部分。

需要注意的是普通样式类和外部样式类的优先级是未定义的,因此使用时请添加!important以保证外部样式类的优先级。

<van-cell\n  title="单元格"\n  value="内容"\n  title-class="cell-title"\n  value-class="cell-value"\n/>\n
.cell-title {\n  color: pink !important;\n  font-size: 20px !important;\n}\n\n.cell-value {\n  color: green !important;\n  font-size: 12px !important;\n}\n

使用 CSS 变量

Vant Weapp 为部分 CSS 属性开放了基于 CSS 属性的定制方案。

相较于 解除样式隔离 和 使用外部样式类,这种方案支持在页面或应用级别对多个组件的样式做批量修改以进行主题样式的定制。

当然,用它来修改单个组件的部分样式也是绰绰有余的。具体的使用方法请查阅定制主题

',5),yd=[fd],qd={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",bd,yd)))},xd={class:"van-doc-markdown-body"},wd=wn('

Vant Weapp

轻量、可靠的小程序 UI 组件库

介绍

Vant 是有赞前端团队开源的移动端组件库,于 2016 年开源,已持续维护 4 年时间。Vant 对内承载了有赞所有核心业务,对外服务十多万开发者,是业界主流的移动端组件库之一。

目前 Vant 官方提供了 Vue 版本微信小程序版本,并由社区团队维护 React 版本

预览

扫描下方小程序二维码,体验组件库示例:

快速上手

请参考 快速上手

贡献代码

使用过程中发现任何问题都可以提 Issue 给我们,当然,我们也非常欢迎你给我们发 PR

加入我们

有赞前端团队是由一群年轻、皮实、对技术饱含热情的小伙伴组成的,目前共有 100 多名前端工程师,分布在业务中台、电商、零售、美业、资产、有赞云、赋能平台、增长中心等业务线。

我们热爱分享和开源,崇尚用工程师的方式解决问题,因此造了很多工具来解决我们遇到的问题,目前我们维护的开源产品有:

我们正在寻找更多优秀的小伙伴,一起拓展前端技术的边界,期待你的加入!

开源协议

本项目基于 MIT 协议,请自由地享受和参与开源

',8),_d=[wd],kd={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",xd,_d)))},Sd={class:"van-doc-markdown-body"},Cd=wn('

快速上手

背景知识

使用 Vant Weapp 前,请确保你已经学习过微信官方的 小程序简易教程自定义组件介绍

安装

步骤一 通过 npm 安装

使用 npm 构建前,请先阅读微信官方的 npm 支持

# 通过 npm 安装\nnpm i @vant/weapp -S --production\n\n# 通过 yarn 安装\nyarn add @vant/weapp --production\n\n# 安装 0.x 版本\nnpm i vant-weapp -S --production\n

步骤二 修改 app.json

将 app.json 中的 "style": "v2" 去除,小程序的新版基础组件强行加上了许多样式,难以覆盖,不关闭将造成部分组件样式混乱。

步骤三 修改 project.config.json

开发者工具创建的项目,miniprogramRoot 默认为 miniprogrampackage.json 在其外部,npm 构建无法正常工作。

需要手动在 project.config.json 内添加如下配置,使开发者工具可以正确索引到 npm 依赖的位置。

{\n  ...\n  "setting": {\n    ...\n    "packNpmManually": true,\n    "packNpmRelationList": [\n      {\n        "packageJsonPath": "./package.json",\n        "miniprogramNpmDistDir": "./miniprogram/"\n      }\n    ]\n  }\n}\n

注意: 由于目前新版开发者工具创建的小程序目录文件结构问题,npm构建的文件目录为miniprogram_npm,并且开发工具会默认在当前目录下创建miniprogram_npm的文件名,所以新版本的miniprogramNpmDistDir配置为’./'即可

步骤四 构建 npm 包

打开微信开发者工具,点击 工具 -> 构建 npm,并勾选 使用 npm 模块 选项,构建完成后,即可引入组件。

步骤五 typescript 支持

如果你使用 typescript 开发小程序,还需要做如下操作,以获得顺畅的开发体验。

安装 miniprogram-api-typings

# 通过 npm 安装\nnpm i -D miniprogram-api-typings\n\n# 通过 yarn 安装\nyarn add -D miniprogram-api-typings\n

在 tsconfig.json 中增加如下配置,以防止 tsc 编译报错。

请将path/to/node_modules/@vant/weapp修改为项目的 node_modules 中 @vant/weapp 所在的目录。

{\n  ...\n  "compilerOptions": {\n    ...\n    "baseUrl": ".",\n    "types": ["miniprogram-api-typings"],\n    "paths": {\n      "@vant/weapp/*": ["path/to/node_modules/@vant/weapp/dist/*"]\n    },\n    "lib": ["ES6"]\n  }\n}\n

示例工程

我们提供了一个示例工程,示例工程会帮助你了解如下内容:

  • 基于 Vant Weapp 搭建小程序应用
  • 样式覆盖方案

使用

引入组件

以 Button 组件为例,只需要在app.jsonindex.json中配置 Button 对应的路径即可。

所有组件文档中的引入路径均以 npm 安装为例,如果你是通过下载源代码的方式使用 @vant/weapp,请将路径修改为项目中 @vant/weapp 所在的目录。

// 通过 npm 安装\n// app.json\n"usingComponents": {\n  "van-button": "@vant/weapp/button/index"\n}\n
// 通过下载源码使用 es6版本\n// app.json\n"usingComponents": {\n  "van-button": "path/to/@vant/weapp/dist/button/index"\n}\n
// 通过下载源码使用 es5版本\n// app.json\n"usingComponents": {\n  "van-button": "path/to/@vant/weapp/lib/button/index"\n}\n

使用组件

引入组件后,可以在 wxml 中直接使用组件

<van-button type="primary">按钮</van-button>\n

其他

在开发者工具中预览示例小程序

\n# 将项目克隆到本地\ngit clone git@github.com:youzan/vant-weapp.git\n\n# 安装项目依赖\ncd vant-weapp && npm install\n\n# 执行组件编译\nnpm run dev\n\n

接着打开微信开发者工具,导入example目录的项目就可以预览示例了。

',14),zd=[Cd],Pd={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Sd,zd)))},Id={class:"van-doc-markdown-body"},Od=wn('

定制主题

背景知识

小程序基于 Shadow DOM 来实现自定义组件,所以 Vant Weapp 使用与之配套的 CSS 变量 来实现定制主题。链接中的内容可以帮助你对这两个概念有基本的认识,避免许多不必要的困扰。

CSS 变量 的兼容性要求可以在 这里 查看。对于不支持 CSS 变量 的设备,定制主题将不会生效,不过不必担心,默认样式仍会生效。

样式变量

定制使用的 CSS 变量 与 Less 变量 同名,下面是一些基本的样式变量,所有可用的颜色变量请参考 配置文件

// Component Colors\n@text-color: #323233;\n@border-color: #ebedf0;\n@active-color: #f2f3f5;\n@background-color: #f8f8f8;\n@background-color-light: #fafafa;\n

定制方法

定制单个组件的主题样式

在 wxss 中为组件设置 CSS 变量

<van-button class="my-button">\n  默认按钮\n</van-button>\n
.my-button {\n  --button-border-radius: 10px;\n  --button-default-color: #f2f3f5;\n}\n

或通过 style 属性来设置 CSS 变量,这使你能够轻松实现主题的动态切换

<van-button style="{{ buttonStyle }}">\n  默认按钮\n</van-button>\n
Page({\n  data: {\n    buttonStyle: `\n      --button-border-radius: 10px;\n      --button-default-color: green;\n    `,\n  },\n\n  onLoad() {\n    setTimeout(() => {\n      this.setData({\n        buttonStyle: `\n          --button-border-radius: 2px;\n          --button-default-color: pink;\n        `,\n      });\n    }, 2000);\n  },\n});\n

定制多个组件的主题样式

与单个组件的定制方式类似,只需用一个 container 节点包裹住需要定制的组件,并将 CSS 变量 设置在 container 节点上

<view class="container">\n  <van-button bind:click="onClick">\n    默认按钮\n  </van-button>\n\n  <van-toast id="van-toast" />\n</view>\n
import Toast from 'path/to/vant-weapp/dist/toast/toast';\n\nPage({\n  onClick() {\n    Toast('我是提示文案,建议不超过十五字~');\n  },\n});\n
.container {\n  --button-border-radius: 10px;\n  --button-default-color: #f2f3f5;\n  --toast-max-width: 100px;\n  --toast-background-color: pink;\n}\n

定制全局主题样式

在 app.wxss 中,写入 CSS 变量,即可对全局生效

page {\n  --button-border-radius: 10px;\n  --button-default-color: #f2f3f5;\n  --toast-max-width: 100px;\n  --toast-background-color: pink;\n}\n
',7),Ed=[Od],Dd={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Id,Ed)))},Td={class:"van-doc-markdown-body"},Ad=wn('

ActionSheet 动作面板

介绍

底部弹起的模态面板,包含与当前情境相关的多个选项。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-action-sheet": "@vant/weapp/action-sheet/index"\n}\n

代码演示

基础用法

需要传入一个actions的数组,数组的每一项是一个对象,对象属性见文档下方表格。

<van-action-sheet\n  show="{{ show }}"\n  actions="{{ actions }}"\n  bind:close="onClose"\n  bind:select="onSelect"\n/>\n
Page({\n  data: {\n    show: false,\n    actions: [\n      {\n        name: '选项',\n      },\n      {\n        name: '选项',\n      },\n      {\n        name: '选项',\n        subname: '描述信息',\n        openType: 'share',\n      },\n    ],\n  },\n\n  onClose() {\n    this.setData({ show: false });\n  },\n\n  onSelect(event) {\n    console.log(event.detail);\n  },\n});\n

选项状态

选项可以设置为加载状态或禁用状态。

<van-action-sheet\n  show="{{ show }}"\n  actions="{{ actions }}"\n  cancel-text="取消"\n/>\n
Page({\n  data: {\n    show: false,\n    actions: [\n      { name: '着色选项', color: '#ee0a24' },\n      { loading: true },\n      { name: '禁用选项', disabled: true },\n    ],\n  },\n});\n

展示取消按钮

设置cancel-text属性后,会在底部展示取消按钮,点击后关闭当前菜单。

<van-action-sheet\n  show="{{ show }}"\n  actions="{{ actions }}"\n  cancel-text="取消"\n/>\n

展示描述信息

设置description属性后,会在选项上方显示描述信息。

<van-action-sheet\n  show="{{ show }}"\n  actions="{{ actions }}"\n  description="这是一段描述信息"\n/>\n

展示标题栏

通过设置title属性展示标题栏,同时可以使用插槽自定义菜单内容。

<van-action-sheet show="{{ show }}" title="标题">\n  <view>内容</view>\n</van-action-sheet>\n

微信开放能力

需要传入一个actions的数组,数组的每一项是一个对象,对象属性见文档下方表格。

<van-action-sheet\n  show="{{ show }}"\n  actions="{{ actions }}"\n  bind:close="onClose"\n  bind:getuserinfo="onGetUserInfo"\n/>\n
Page({\n  data: {\n    show: false,\n    actions: [\n      { name: '获取用户信息', color: '#07c160', openType: 'getUserInfo' },\n    ],\n  },\n\n  onClose() {\n    this.setData({ show: false });\n  },\n\n  onGetUserInfo(e) {\n    console.log(e.detail);\n  },\n});\n

API

Props

参数说明类型默认值
show是否显示动作面板boolean-
actions菜单选项Array[]
title标题string-
description v1.0.0选项上方的描述信息string-
z-indexz-index 层级number100
cancel-text取消按钮文字string-
overlay是否显示遮罩层boolean-
round v1.0.0是否显示圆角booleantrue
close-on-click-action是否在点击选项后关闭booleantrue
close-on-click-overlay点击遮罩是否关闭菜单boolean-
safe-area-inset-bottom是否为 iPhoneX 留出底部安全距离booleantrue

Events

事件名说明参数
bind:select选中选项时触发,禁用或加载状态下不会触发event.detail: 选项对应的对象
bind:close关闭时触发-
bind:cancel取消按钮点击时触发-
bind:click-overlay点击遮罩层时触发-
bind:getuserinfo用户点击该按钮时,会返回获取到的用户信息,回调的 detail 数据与 wx.getUserInfo 返回的一致,openType="getUserInfo"时有效-
bind:contact客服消息回调,openType="contact"时有效-
bind:getphonenumber获取用户手机号回调,openType="getPhoneNumber"时有效-
bind:error当使用开放能力时,发生错误的回调,openType="launchApp"时有效-
bind:launchapp打开 APP 成功的回调,openType="launchApp"时有效-
bind:opensetting在打开授权设置页后回调,openType="openSetting"时有效-

actions

API中的actions为一个对象数组,数组中的每一个对象配置每一列,每一列有以下key

键名说明类型默认值
name标题string-
subname二级标题string-
color选项文字颜色string-
loading是否为加载状态boolean-
disabled是否为禁用状态boolean-
className为对应列添加额外的 class 类名string-
openType微信开放能力,具体支持可参考 微信官方文档string-
lang指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文stringen
sessionFrom会话来源,openType="contact"时有效string-
sendMessageTitle会话内消息卡片标题,openType="contact"时有效string当前标题
sendMessagePath会话内消息卡片点击跳转小程序路径,openType="contact"时有效string当前分享路径
sendMessageImg会话内消息卡片图片,openType="contact"时有效string截图
showMessageCard是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息,openType="contact"时有效stringfalse
appParameter打开 APP 时,向 APP 传递的参数,openType=launchApp 时有效string-
',14),Nd=[Ad],Fd={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Td,Nd)))},Ld={class:"van-doc-markdown-body"},Rd=wn('

Area 省市区选择

介绍

省市区选择组件通常与 弹出层 组件配合使用。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-area": "@vant/weapp/area/index"\n}\n

代码演示

基础用法

初始化省市区组件时,需要通过 area-list 属性传入省市区数据。

<van-area area-list="{{ areaList }}" />\n

areaList 格式

areaList 为对象结构,包含 province_listcity_listcounty_list 三个 key。

每项以地区码作为 key,省市区名字作为 value。地区码为 6 位数字,前两位代表省份,中间两位代表城市,后两位代表区县,以 0 补足 6 位。比如北京的地区码为 11,以 0 补足 6 位,为 110000

示例数据如下:

const areaList = {\n  province_list: {\n    110000: '北京市',\n    120000: '天津市',\n  },\n  city_list: {\n    110100: '北京市',\n    120100: '天津市',\n  },\n  county_list: {\n    110101: '东城区',\n    110102: '西城区',\n    // ....\n  },\n};\n

@vant/area-data

Vant 官方提供了一份默认的省市区数据,可以通过 @vant/area-data 引入。

yarn add @vant/area-data\n
import { areaList } from '@vant/area-data';\n\nPage({\n  data: {\n    areaList,\n  },\n});\n

选中省市区

如果想选中某个省市区,需要传入一个value属性,绑定对应的省市区code

<van-area area-list="{{ areaList }}" value="110101" />\n

配置显示列

可以通过columns-num属性配置省市区显示的列数,默认情况下会显示省市区,当你设置为2,则只会显示省市选择。

<van-area area-list="{{ areaList }}" columns-num="{{ 2 }}" title="标题" />\n

配置列占位提示文字

可以通过columns-placeholder属性配置每一列的占位提示文字。

<van-area\n  area-list="{{ areaList }}"\n  columns-placeholder="{{ ['请选择', '请选择', '请选择'] }}"\n  title="标题"\n/>\n

云开发示例

使用云开发获取省市区数据

实际项目中,可以通过小程序云开发的能力,将省市区数据保存在云开发的数据库中,并在小程序中使用云开发的接口异步获取数据。

在小程序中使用云能力之前需要先调用wx.could.init方法完成云能力的初始化。

const db = wx.cloud.database();\n\ndb.collection('region')\n  .limit(1)\n  .get()\n  .then((res) => {\n    if (res.data && res.data.length > 0) {\n      this.setData({\n        areaList: res.data[0],\n      });\n    }\n  })\n  .catch((err) => {\n    console.log(err);\n  });\n

API

Props

参数说明类型默认值
value当前选中的省市区codestring-
title顶部栏标题string-
area-list省市区数据,格式见下方object-
columns-num省市区显示列数,3-省市区,2-省市,1-省string | number3
columns-placeholder列占位提示文字string[][]
loading是否显示加载状态booleanfalse
item-height选项高度number44
visible-item-count可见的选项个数number6
confirm-button-text确认按钮文字string确认
cancel-button-text取消按钮文字string取消

Events

事件说明回调参数
bind:confirm点击右上方完成按钮一个数组参数,具体格式看下方数据格式章节
bind:cancel点击取消按钮时-
bind:change选项改变时触发Picker 实例,所有列选中值,当前列对应的索引

方法

通过 selectComponent 可以获取到 Area 实例并调用实例方法。

方法名参数返回值介绍
resetcode: string-根据 code 重置所有选项,若不传 code,则重置到第一项

点击完成时返回的数据格式

返回的数据整体为一个 Object,包含 values, indexs 两个 key。

values 整体为一个数组,数组内包含 columnsNum 个数据, 每个数据对应一列选项中被选中的数据。

code 代表被选中的地区编码, name 代表被选中的地区名称。

[\n  {\n    code: '110000',\n    name: '北京市',\n  },\n  {\n    code: '110100',\n    name: '北京市',\n  },\n  {\n    code: '110101',\n    name: '东城区',\n  },\n];\n

indexs 为一个数组,数组内包含 columnsNum 个数据, 每个数据对应一列选项中被选中项的序号。

',17),Bd=[Rd],Md={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Ld,Bd)))},$d={class:"van-doc-markdown-body"},Ud=wn('

Button 按钮

介绍

按钮用于触发一个操作,如提交表单。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-button": "@vant/weapp/button/index"\n}\n

代码演示

按钮类型

支持defaultprimaryinfowarningdanger五种类型,默认为default

<van-button type="default">默认按钮</van-button>\n<van-button type="primary">主要按钮</van-button>\n<van-button type="info">信息按钮</van-button>\n<van-button type="warning">警告按钮</van-button>\n<van-button type="danger">危险按钮</van-button>\n

朴素按钮

通过plain属性将按钮设置为朴素按钮,朴素按钮的文字为按钮颜色,背景为白色。

<van-button plain type="primary">朴素按钮</van-button>\n<van-button plain type="info">朴素按钮</van-button>\n

细边框

设置hairline属性可以开启 0.5px 边框,基于伪类实现。

<van-button plain hairline type="primary">细边框按钮</van-button>\n<van-button plain hairline type="info">细边框按钮</van-button>\n

禁用状态

通过disabled属性来禁用按钮,此时按钮的bind:click事件不会触发。

<van-button disabled type="primary">禁用状态</van-button>\n<van-button disabled type="info">禁用状态</van-button>\n

加载状态

<van-button loading type="primary" />\n<van-button loading type="primary" loading-type="spinner" />\n<van-button loading type="info" loading-text="加载中..." />\n

按钮形状

<van-button square type="primary">方形按钮</van-button>\n<van-button round type="info">圆形按钮</van-button>\n

图标按钮

通过icon属性设置按钮图标,支持 Icon 组件里的所有图标,也可以传入图标 URL。

<van-button icon="star-o" type="primary" />\n<van-button icon="star-o" type="primary">按钮</van-button>\n<van-button icon="https://img.yzcdn.cn/vant/logo.png" type="info">\n  按钮\n</van-button>\n

按钮尺寸

支持largenormalsmallmini四种尺寸,默认为normal

<van-button type="primary" size="large">大号按钮</van-button>\n<van-button type="primary" size="normal">普通按钮</van-button>\n<van-button type="primary" size="small">小型按钮</van-button>\n<van-button type="primary" size="mini">迷你按钮</van-button>\n

块级元素

通过block属性可以将按钮的元素类型设置为块级元素。

<van-button type="primary" block>块级元素</van-button>\n

自定义颜色

通过color属性可以自定义按钮的颜色。

<van-button color="#7232dd">单色按钮</van-button>\n<van-button color="#7232dd" plain>单色按钮</van-button>\n<van-button color="linear-gradient(to right, #4bb0ff, #6149f6)">\n  渐变色按钮\n</van-button>\n

API

Props

参数说明类型默认值
id标识符string-
type按钮类型,可选值为 primary info warning dangerstringdefault
size按钮尺寸,可选值为 normal large small ministringnormal
color v1.0.0按钮颜色,支持传入linear-gradient渐变色string-
icon左侧图标名称或图片链接,可选值见 Icon 组件string-
class-prefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
plain是否为朴素按钮booleanfalse
block是否为块级元素booleanfalse
round是否为圆形按钮booleanfalse
square是否为方形按钮booleanfalse
disabled是否禁用按钮booleanfalse
hairline是否使用 0.5px 边框booleanfalse
loading是否显示为加载状态booleanfalse
loading-text加载状态提示文字string-
loading-type加载状态图标类型,可选值为 spinnerstringcircular
loading-size加载图标大小string20px
custom-style自定义样式string-
open-type微信开放能力,具体支持可参考 微信官方文档string-
app-parameter打开 APP 时,向 APP 传递的参数string-
lang指定返回用户信息的语言,zh_CN 简体中文,
zh_TW 繁体中文,en 英文
stringen
session-from会话来源string-
business-id客服消息子商户 idnumber-
send-message-title会话内消息卡片标题string当前标题
send-message-path会话内消息卡片点击跳转小程序路径string当前分享路径
send-message-imgsendMessageImgstring截图
show-message-card显示会话内消息卡片stringfalse
dataset按钮 dataset,open-type 为 share 时,可在 onShareAppMessage 事件的 event.target.dataset.detail 中看到传入的值any-
form-type用于 form 组件,可选值为submit reset,点击分别会触发 form 组件的 submit/reset 事件string-

Events

事件名说明参数
bind:click点击按钮,且按钮状态不为加载或禁用时触发-
bind:getuserinfo用户点击该按钮时,会返回获取到的用户信息,
从返回参数的 detail 中获取到的值同 wx.getUserInfo
-
bind:contact客服消息回调-
bind:getphonenumber获取用户手机号回调-
bind:error当使用开放能力时,发生错误的回调-
bind:opensetting在打开授权设置页后回调-

Button 提供的是 click 事件而不是原生 tap 事件,按钮禁用时,click 事件不会触发,tap 事件依然会触发。

外部样式类

类名说明
custom-class根节点样式类
loading-class加载图标样式类
',18),Vd=[Ud],Hd={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",$d,Vd)))},Wd={class:"van-doc-markdown-body"},Gd=wn('

Calendar 日历

介绍

日历组件用于选择日期或日期区间。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-calendar": "@vant/weapp/calendar/index"\n}\n

代码演示

选择单个日期

下面演示了结合单元格来使用日历组件的用法,日期选择完成后会触发confirm事件。

<van-cell title="选择单个日期" value="{{ date }}" bind:click="onDisplay" />\n<van-calendar show="{{ show }}" bind:close="onClose" bind:confirm="onConfirm" />\n
Page({\n  data: {\n    date: '',\n    show: false,\n  },\n\n  onDisplay() {\n    this.setData({ show: true });\n  },\n  onClose() {\n    this.setData({ show: false });\n  },\n  formatDate(date) {\n    date = new Date(date);\n    return `${date.getMonth() + 1}/${date.getDate()}`;\n  },\n  onConfirm(event) {\n    this.setData({\n      show: false,\n      date: this.formatDate(event.detail),\n    });\n  },\n});\n

选择多个日期

设置typemultiple后可以选择多个日期,此时confirm事件返回的 date 为数组结构,数组包含若干个选中的日期。

<van-cell title="选择多个日期" value="{{ text }}" bind:click="onDisplay" />\n<van-calendar\n  show="{{ show }}"\n  type="multiple"\n  bind:close="onClose"\n  bind:confirm="onConfirm"\n/>\n
Page({\n  data: {\n    text: '',\n    show: false,\n  },\n\n  onDisplay() {\n    this.setData({ show: true });\n  },\n  onClose() {\n    this.setData({ show: false });\n  },\n  onConfirm(event) {\n    this.setData({\n      show: false,\n      date: `选择了 ${event.detail.length} 个日期`,\n    });\n  },\n});\n

选择日期区间

设置typerange后可以选择日期区间,此时confirm事件返回的 date 为数组结构,数组第一项为开始时间,第二项为结束时间。

<van-cell title="选择日期区间" value="{{ date }}" bind:click="onDisplay" />\n<van-calendar\n  show="{{ show }}"\n  type="range"\n  bind:close="onClose"\n  bind:confirm="onConfirm"\n/>\n
Page({\n  data: {\n    date: '',\n    show: false,\n  },\n\n  onDisplay() {\n    this.setData({ show: true });\n  },\n  onClose() {\n    this.setData({ show: false });\n  },\n  formatDate(date) {\n    date = new Date(date);\n    return `${date.getMonth() + 1}/${date.getDate()}`;\n  },\n  onConfirm(event) {\n    const [start, end] = event.detail;\n    this.setData({\n      show: false,\n      date: `${this.formatDate(start)} - ${this.formatDate(end)}`,\n    });\n  },\n});\n

Tips: 默认情况下,日期区间的起止时间不能为同一天,可以通过设置 allow-same-day 属性来允许选择同一天。

快捷选择

show-confirm设置为false可以隐藏确认按钮,这种情况下选择完成后会立即触发confirm事件。

<van-calendar show="{{ show }}" show-confirm="{{ false }}" />\n

自定义颜色

通过color属性可以自定义日历的颜色,对选中日期和底部按钮生效。

<van-calendar show="{{ show }}" color="#07c160" />\n

自定义日期范围

通过min-datemax-date定义日历的范围,需要注意的是min-datemax-date的区间不宜过大,否则会造成严重的性能问题。

<van-calendar\n  show="{{ show }}"\n  min-date="{{ minDate }}"\n  max-date="{{ maxDate }}"\n/>\n
Page({\n  data: {\n    show: false,\n    minDate: new Date(2010, 0, 1).getTime(),\n    maxDate: new Date(2010, 0, 31).getTime(),\n  },\n});\n

自定义按钮文字

通过confirm-text设置按钮文字,通过confirm-disabled-text设置按钮禁用时的文字。

<van-calendar\n  show="{{ show }}"\n  type="range"\n  confirm-text="完成"\n  confirm-disabled-text="请选择结束时间"\n/>\n

自定义日期文案

通过传入formatter函数来对日历上每一格的内容进行格式化

<van-calendar show="{{ show }}" type="range" formatter="{{ formatter }}" />\n
Page({\n  data: {\n    formatter(day) {\n      const month = day.date.getMonth() + 1;\n      const date = day.date.getDate();\n\n      if (month === 5) {\n        if (date === 1) {\n          day.topInfo = '劳动节';\n        } else if (date === 4) {\n          day.topInfo = '五四青年节';\n        } else if (date === 11) {\n          day.text = '今天';\n        }\n      }\n\n      if (day.type === 'start') {\n        day.bottomInfo = '入住';\n      } else if (day.type === 'end') {\n        day.bottomInfo = '离店';\n      }\n\n      return day;\n    },\n  },\n});\n

自定义弹出位置

通过position属性自定义弹出层的弹出位置,可选值为topleftright

<van-calendar show="{{ show }}" round="false" position="right" />\n

日期区间最大范围

选择日期区间时,可以通过max-range属性来指定最多可选天数,选择的范围超过最多可选天数时,会弹出相应的提示文案。

<van-calendar type="range" max-range="{{ 3 }}" />\n

自定义周起始日

通过 first-day-of-week 属性设置一周从哪天开始。

<van-calendar first-day-of-week="{{ 1 }}" />\n

平铺展示

poppable设置为false,日历会直接展示在页面内,而不是以弹层的形式出现。

<van-calendar\n  title="日历"\n  poppable="{{ false }}"\n  show-confirm="{{ false }}"\n  class="calendar"\n/>\n
.calendar {\n  --calendar-height: 500px;\n}\n

API

Props

参数说明类型默认值
type选择类型:
single表示选择单个日期,
multiple表示选择多个日期,
range表示选择日期区间
stringsingle
title日历标题string日期选择
color主题色,对底部按钮和选中日期生效string#ee0a24
min-date可选择的最小日期timestamp当前日期
max-date可选择的最大日期timestamp当前日期的六个月后
default-date默认选中的日期,typemultiplerange时为数组timestamp | timestamp[]今天
row-height日期行高number | string64
formatter日期格式化函数(day: Day) => Day-
poppable是否以弹层的形式展示日历booleantrue
show-mark是否显示月份背景水印booleantrue
show-title是否展示日历标题booleantrue
show-subtitle是否展示日历副标题(年月)booleantrue
show-confirm是否展示确认按钮booleantrue
confirm-text确认按钮的文字string确定
confirm-disabled-text确认按钮处于禁用状态时的文字string确定
first-day-of-week设置周起始日0~60

Poppable Props

当 Calendar 的 poppabletrue 时,支持以下 props:

参数说明类型默认值
show是否显示日历弹窗booleanfalse
position弹出位置,可选值为 top right leftstringbottom
round是否显示圆角弹窗booleantrue
close-on-click-overlay是否在点击遮罩层后关闭booleantrue
safe-area-inset-bottom是否开启底部安全区适配booleantrue

Range Props

当 Calendar 的 typerange 时,支持以下 props:

参数说明类型默认值
max-range日期区间最多可选天数,默认无限制number | string-
range-prompt范围选择超过最多可选天数时的提示文案string | null选择天数不能超过 xx 天
show-range-prompt范围选择超过最多可选天数时,是否展示提示文案booleantrue
allow-same-day是否允许日期范围的起止时间为同一天booleanfalse

Day 数据结构

日历中的每个日期都对应一个 Day 对象,通过formatter属性可以自定义 Day 对象的内容。

键名说明类型
date日期对应的 Date 对象Date
type日期类型,可选值为selectedstartmiddleenddisabledstring
text中间显示的文字string
topInfo上方的提示信息string
bottomInfo下方的提示信息string
className自定义 classNamestring

Events

事件名说明回调参数
select点击任意日期时触发value: Date | Date[]
unselect当 Calendar 的 typemultiple 时,点击已选中的日期时触发value: Date
confirm日期选择完成后触发,若show-confirmtrue,则点击确认按钮后触发value: Date | Date[]
open打开弹出层时触发-
close关闭弹出层时触发-
opened打开弹出层且动画结束后触发-
closed关闭弹出层且动画结束后触发-
over-range范围选择超过最多可选天数时触发-
click-subtitle v1.8.1点击日历副标题时触发WechatMiniprogram.TouchEvent

Slots

名称说明
title自定义标题
footer自定义底部区域内容

方法

通过 selectComponent 可以获取到 Calendar 实例并调用实例方法。

方法名说明参数返回值
reset重置选中的日期到默认值--
',24),Kd=[Gd],Qd={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Wd,Kd)))},Yd={class:"van-doc-markdown-body"},Xd=[wn('

Card 商品卡片

介绍

商品卡片,用于展示商品的图片、价格等信息。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-card": "@vant/weapp/card/index"\n}\n

代码演示

基础用法

<van-card\n  num="2"\n  price="2.00"\n  desc="描述信息"\n  title="商品标题"\n  thumb="{{ imageURL }}"\n/>\n

高级用法

可以通过插槽添加定制内容。

<van-card\n  num="2"\n  tag="标签"\n  price="10.00"\n  desc="描述信息"\n  title="商品标题"\n  thumb="{{ imageURL }}"\n>\n  <view slot="footer">\n    <van-button size="mini">按钮</van-button>\n    <van-button size="mini">按钮</van-button>\n  </view>\n</van-card>\n

API

Props

参数说明类型默认值
thumb左侧图片string-
thumb-mode左侧图片裁剪、缩放的模式,可选值参考小程序 image 组件 mode 属性值stringaspectFit
title标题string-
desc描述string-
tag标签string-
num商品数量string | number-
price商品价格string | number-
origin-price商品划线原价string | number-
centered内容是否垂直居中stringfalse
currency货币符号string¥
thumb-link点击左侧图片后跳转的链接地址string-
link-type链接跳转类型,可选值为 redirectTo switchTab reLaunchstringnavigateTo
lazy-load是否开启图片懒加载booleanfalse

Slot

名称说明
title自定义标题栏,如果设置了title属性则不生效
desc自定义描述栏,如果设置了desc属性则不生效
num自定义数量
price自定义价格
origin-price自定义商品原价,如果设置了origin-price属性则不生效
price-top自定义价格上方区域
bottom自定义价格下方区域
thumb自定义图片,如果设置了thumb属性则不生效
tag自定义图片角标,如果设置了tag属性则不生效
tags自定义描述下方标签区域
footer自定义右下角内容

外部样式类

类名说明
custom-class根节点样式类
thumb-class左侧图片样式类
title-class标题样式类
price-class价格样式类
origin-price-class划线原价样式类
desc-class描述样式类
num-class数量样式类
',10)],Jd={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Yd,Xd)))},Zd={class:"van-doc-markdown-body"},sr=[wn('

Cell 单元格

介绍

单元格为列表中的单个展示项。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-cell": "@vant/weapp/cell/index",\n  "van-cell-group": "@vant/weapp/cell-group/index"\n}\n

代码演示

基础用法

Cell可以单独使用,也可以与CellGroup搭配使用。CellGroup可以为Cell提供上下外边框。

<van-cell-group>\n  <van-cell title="单元格" value="内容" />\n  <van-cell title="单元格" value="内容" label="描述信息" border="{{ false }}" />\n</van-cell-group>\n

卡片风格

通过 CellGroupinset 属性,可以将单元格转换为圆角卡片风格(从 1.7.2 版本开始支持)。

<van-cell-group inset>\n  <van-cell title="单元格" value="内容" />\n  <van-cell title="单元格" value="内容" label="描述信息" />\n</van-cell-group>\n

单元格大小

通过size属性可以控制单元格的大小。

<van-cell title="单元格" value="内容" size="large" />\n<van-cell title="单元格" value="内容" size="large" label="描述信息" />\n

展示图标

通过icon属性在标题左侧展示图标。

<van-cell title="单元格" icon="location-o" />\n

展示箭头

设置is-link属性后会在单元格右侧显示箭头,并且可以通过arrow-direction属性控制箭头方向。

<van-cell title="单元格" is-link />\n<van-cell title="单元格" is-link value="内容" />\n<van-cell title="单元格" is-link value="内容" arrow-direction="down" />\n

页面跳转

可以通过url属性进行页面跳转,通过link-type属性控制跳转类型。

<van-cell\n  is-link\n  title="单元格"\n  link-type="navigateTo"\n  url="/pages/dashboard/index"\n/>\n

分组标题

通过CellGrouptitle属性可以指定分组标题。

<van-cell-group title="分组1">\n  <van-cell title="单元格" value="内容" />\n</van-cell-group>\n<van-cell-group title="分组2">\n  <van-cell title="单元格" value="内容" />\n</van-cell-group>\n

使用插槽

如以上用法不能满足你的需求,可以使用插槽来自定义内容。

<van-cell value="内容" icon="shop-o" is-link>\n  <view slot="title">\n    <view class="van-cell-text">单元格</view>\n    <van-tag type="danger">标签</van-tag>\n  </view>\n</van-cell>\n<van-cell title="单元格">\n  <van-icon slot="right-icon" name="search" class="custom-icon" />\n</van-cell>\n

垂直居中

通过center属性可以让Cell的左右内容都垂直居中。

<van-cell center title="单元格" value="内容" label="描述信息" />\n

API

CellGroup Props

参数说明类型默认值
title分组标题string-
inset v1.7.2是否展示为圆角卡片风格booleanfalse
border是否显示外边框booleantrue

CellGroup 外部样式类

类名说明
custom-class根节点样式类

Cell Props

参数说明类型默认值
icon左侧图标名称或图片链接,可选值见 Icon 组件string-
title左侧标题string | number-
title-width标题宽度,须包含单位string-
value右侧内容string | number-
label标题下方的描述信息string-
size单元格大小,可选值为 largestring-
border是否显示下边框booleantrue
center是否使内容垂直居中booleanfalse
url点击后跳转的链接地址string-
link-type链接跳转类型,可选值为 redirectTo switchTab reLaunchstringnavigateTo
clickable是否开启点击反馈booleanfalse
is-link是否展示右侧箭头并开启点击反馈booleanfalse
required是否显示表单必填星号booleanfalse
arrow-direction箭头方向,可选值为 left up downstring-
use-label-slot是否使用 label slotbooleanfalse
title-style v1.4.0标题样式string-

Cell Event

事件名说明参数
bind:click点击单元格时触发-

Cell Slot

名称说明
-自定义value显示内容,如果设置了value属性则不生效
title自定义title显示内容,如果设置了title属性则不生效
label自定义label显示内容,需要设置 use-label-slot属性
icon自定义icon显示内容,如果设置了icon属性则不生效
right-icon自定义右侧按钮,默认是arrow,如果设置了is-link属性则不生效

Cell 外部样式类

类名说明
custom-class根节点样式类
title-class标题样式类
label-class描述信息样式类
value-class右侧内容样式类
',20)],ar={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Zd,sr)))},tr={class:"van-doc-markdown-body"},nr=[wn('

Checkbox 复选框

介绍

在一组备选项中进行多选。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-checkbox": "@vant/weapp/checkbox/index",\n  "van-checkbox-group": "@vant/weapp/checkbox-group/index"\n}\n

代码演示

基础用法

通过value绑定复选框的勾选状态。

<van-checkbox value="{{ checked }}" bind:change="onChange">复选框</van-checkbox>\n
Page({\n  data: {\n    checked: true,\n  },\n\n  onChange(event) {\n    this.setData({\n      checked: event.detail,\n    });\n  },\n});\n

禁用状态

通过设置disabled属性可以禁用复选框。

<van-checkbox disabled value="{{ checked }}" bind:change="onChange">\n  复选框\n</van-checkbox>\n

自定义形状

shape属性设置为square,复选框的形状会变成方形。

<van-checkbox value="{{ checked }}" shape="square" bind:change="onChange">\n  复选框\n</van-checkbox>\n

自定义颜色

通过checked-color属性可以自定义选中状态下的图标颜色。

<van-checkbox\n  value="{{ checked }}"\n  checked-color="#07c160"\n  bind:change="onChange"\n>\n  复选框\n</van-checkbox>\n

自定义大小

通过icon-size属性可以自定义图标的大小。

<van-checkbox value="{{ checked }}" icon-size="25px">复选框</van-checkbox>\n

自定义图标

通过 icon 插槽自定义图标。

<van-checkbox use-icon-slot value="{{ checked }}" bind:change="onChange">\n  自定义图标\n  <image slot="icon" src="{{ checked ? activeIcon : inactiveIcon }}" />\n</van-checkbox>\n
Page({\n  data: {\n    checked: true,\n    activeIcon: '//img.yzcdn.cn/icon-active.png',\n    inactiveIcon: '//img.yzcdn.cn/icon-normal.png',\n  },\n\n  onChange(event) {\n    this.setData({\n      checked: event.detail,\n    });\n  },\n});\n

禁用文本点击

通过设置label-disabled属性可以禁用复选框文本点击。

<van-checkbox value="{{ checked }}" label-disabled>复选框</van-checkbox>\n

复选框组

需要与van-checkbox-group一起使用,选中值是一个数组,通过value绑定在van-checkbox-group上,数组中的项即为选中的Checkboxname属性设置的值。

<van-checkbox-group value="{{ result }}" bind:change="onChange">\n  <van-checkbox name="a">复选框 a</van-checkbox>\n  <van-checkbox name="b">复选框 b</van-checkbox>\n  <van-checkbox name="c">复选框 c</van-checkbox>\n</van-checkbox-group>\n
Page({\n  data: {\n    result: ['a', 'b'],\n  },\n\n  onChange(event) {\n    this.setData({\n      result: event.detail,\n    });\n  },\n});\n

限制最大可选数

<van-checkbox-group value="{{ result }}" bind:change="onChange" max="{{ 2 }}">\n  <van-checkbox name="a">复选框 a</van-checkbox>\n  <van-checkbox name="b">复选框 b</van-checkbox>\n  <van-checkbox name="c">复选框 c</van-checkbox>\n</van-checkbox-group>\n

搭配单元格组件使用

此时你需要再引入CellCellGroup组件,并通过 checkbox 的 toggle 方法手动触发切换。

<van-checkbox-group value="{{ result }}" bind:change="onChange">\n  <van-cell-group>\n    <van-cell\n      wx:for="{{ list }}"\n      wx:key="index"\n      title="复选框 {{ item }}"\n      value-class="value-class"\n      clickable\n      data-index="{{ index }}"\n      bind:click="toggle"\n    >\n      <van-checkbox\n        catch:tap="noop"\n        class="checkboxes-{{ index }}"\n        name="{{ item }}"\n      />\n    </van-cell>\n  </van-cell-group>\n</van-checkbox-group>\n
Page({\n  data: {\n    list: ['a', 'b', 'c'],\n    result: ['a', 'b'],\n  },\n\n  onChange(event) {\n    this.setData({\n      result: event.detail,\n    });\n  },\n\n  toggle(event) {\n    const { index } = event.currentTarget.dataset;\n    const checkbox = this.selectComponent(`.checkboxes-${index}`);\n    checkbox.toggle();\n  },\n\n  noop() {},\n});\n
.value-class {\n  flex: none !important;\n}\n

API

Checkbox Props

参数说明类型默认值
name标识 Checkbox 名称string-
shape形状,可选值为 round squarestringround
value是否为选中状态booleanfalse
disabled是否禁用单选框booleanfalse
label-disabled是否禁用单选框内容点击booleanfalse
label-position文本位置,可选值为 leftstringright
use-icon-slot是否使用 icon slotbooleanfalse
checked-color选中状态颜色string#1989fa
icon-sizeicon 大小string | number20px

CheckboxGroup Props

参数说明类型默认值
name在表单内提交时的标识符string-
value所有选中项的 nameArray-
disabled是否禁用所有单选框booleanfalse
max设置最大可选数number0(无限制)
direction v1.7.0排列方向,可选值为 horizontalstringvertical

Checkbox Event

事件名说明回调参数
bind:change当绑定值变化时触发的事件当前组件的值

Checkbox 外部样式类

类名说明
custom-class根节点样式类
icon-class图标样式类
label-class描述信息样式类

CheckboxGroup Event

事件名说明回调参数
bind:change当绑定值变化时触发的事件当前组件的值

Checkbox Slot

名称说明
-自定义文本
icon自定义图标

Checkbox 方法

通过 selectComponent 可以获取到 checkbox 实例并调用实例方法。

方法名参数返回值介绍
toggle--切换选中状态
',22)],er={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",tr,nr)))},lr={class:"van-doc-markdown-body"},pr=[wn('

Circle 环形进度条

介绍

圆环形的进度条组件,支持进度渐变动画。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-circle": "@vant/weapp/circle/index"\n}\n

代码演示

基础用法

value属性表示进度条的目标进度。

<van-circle value="{{ 30 }}" text="text" />\n

宽度定制

通过stroke-width属性来控制进度条宽度。

<van-circle value="{{ value }}" stroke-width="6" text="宽度定制" />\n

颜色定制

通过color属性来控制进度条颜色,layer-color属性来控制轨道颜色。

<van-circle\n  value="{{ value }}"\n  layer-color="#eeeeee"\n  color="#ee0a24"\n  text="颜色定制"\n/>\n

渐变色

color属性支持传入对象格式来定义渐变色。

<van-circle value="{{ value }}" color="{{ gradientColor }}" text="渐变色" />\n
Page({\n  data: {\n    value: 25,\n    gradientColor: {\n      '0%': '#ffd01e',\n      '100%': '#ee0a24',\n    },\n  },\n});\n

逆时针方向

clockwise设置为false,进度会从逆时针方向开始。

<van-circle\n  value="{{ value }}"\n  color="#07c160"\n  clockwise="{{ false }}"\n  text="逆时针"\n/>\n

大小定制

通过size属性设置圆环直径。

<van-circle value="{{ value }}" size="120" text="大小定制" />\n

API

Props

参数说明类型默认值
value目标进度number0
type指定 canvas 类型,可选值为 2dstring-
size圆环直径,默认单位为 pxnumber100
color进度条颜色,传入对象格式可以定义渐变色string | object#1989fa
layer-color轨道颜色string#fff
fill填充颜色string-
speed动画速度(单位为 value/s)number50
text文字string-
stroke-width进度条宽度number4
clockwise是否顺时针增加booleantrue

Slots

名称说明
-自定义文字内容,如果设置了fill,插槽内容会被原生组件覆盖
',13)],cr={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",lr,pr)))},or={class:"van-doc-markdown-body"},dr=[wn('

Layout 布局

介绍

Layout 提供了van-rowvan-col两个组件来进行行列布局。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-row": "@vant/weapp/row/index",\n  "van-col": "@vant/weapp/col/index"\n}\n

代码演示

基本用法

Layout 组件提供了24列栅格,通过在Col上添加span属性设置列所占的宽度百分比。此外,添加offset属性可以设置列的偏移宽度,计算方式与 span 相同。

<van-row>\n  <van-col span="8">span: 8</van-col>\n  <van-col span="8">span: 8</van-col>\n  <van-col span="8">span: 8</van-col>\n</van-row>\n\n<van-row>\n  <van-col span="4">span: 4</van-col>\n  <van-col span="10" offset="4">offset: 4, span: 10</van-col>\n</van-row>\n\n<van-row>\n  <van-col offset="12" span="12">offset: 12, span: 12</van-col>\n</van-row>\n

设置列元素间距

通过gutter属性可以设置列元素之间的间距,默认间距为 0。

<van-row gutter="20">\n  <van-col span="8">span: 8</van-col>\n  <van-col span="8">span: 8</van-col>\n  <van-col span="8">span: 8</van-col>\n</van-row>\n

API

Row Props

参数说明类型默认值
gutter列元素之间的间距(单位为 px)string | number-

Col Props

参数说明类型默认值
span列元素宽度string | number-
offset列元素偏移距离string | number-

外部样式类

类名说明
custom-class根节点样式类
',10)],rr={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",or,dr)))},ir={class:"van-doc-markdown-body"},hr=[wn('

Collapse 折叠面板

介绍

将一组内容放置在多个折叠面板中,点击面板的标题可以展开或收缩其内容。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-collapse": "@vant/weapp/collapse/index",\n  "van-collapse-item": "@vant/weapp/collapse-item/index"\n}\n

代码演示

基础用法

通过value控制展开的面板列表,activeNames为数组格式。

<van-collapse value="{{ activeNames }}" bind:change="onChange">\n  <van-collapse-item title="有赞微商城" name="1">\n    提供多样店铺模板,快速搭建网上商城\n  </van-collapse-item>\n  <van-collapse-item title="有赞零售" name="2">\n    网店吸粉获客、会员分层营销、一机多种收款,告别经营低效和客户流失\n  </van-collapse-item>\n  <van-collapse-item title="有赞美业" name="3" disabled>\n    线上拓客,随时预约,贴心顺手的开单收银\n  </van-collapse-item>\n</van-collapse>\n
Page({\n  data: {\n    activeNames: ['1'],\n  },\n  onChange(event) {\n    this.setData({\n      activeNames: event.detail,\n    });\n  },\n});\n

手风琴

通过accordion可以设置为手风琴模式,最多展开一个面板,此时activeName为字符串格式。

<van-collapse accordion value="{{ activeName }}" bind:change="onChange">\n  <van-collapse-item title="有赞微商城" name="1">\n    提供多样店铺模板,快速搭建网上商城\n  </van-collapse-item>\n  <van-collapse-item title="有赞零售" name="2">\n    网店吸粉获客、会员分层营销、一机多种收款,告别经营低效和客户流失\n  </van-collapse-item>\n  <van-collapse-item title="有赞美业" name="3">\n    线上拓客,随时预约,贴心顺手的开单收银\n  </van-collapse-item>\n</van-collapse>\n
Page({\n  data: {\n    activeName: '1',\n  },\n  onChange(event) {\n    this.setData({\n      activeName: event.detail,\n    });\n  },\n});\n

事件监听

van-collapse 提供了 change, openclose 事件。change 事件在面板切换时触发,open 事件在面板展开时触发,close 事件在面板关闭时触发。

<van-collapse\n  value="{{ activeNames }}"\n  bind:change="onChange"\n  bind:open="onOpen"\n  bind:close="onClose"\n>\n  <van-collapse-item title="有赞微商城" name="1">\n    提供多样店铺模板,快速搭建网上商城\n  </van-collapse-item>\n  <van-collapse-item title="有赞零售" name="2">\n    网店吸粉获客、会员分层营销、一机多种收款,告别经营低效和客户流失\n  </van-collapse-item>\n  <van-collapse-item title="有赞美业" name="3">\n    线上拓客,随时预约,贴心顺手的开单收银\n  </van-collapse-item>\n</van-collapse>\n
Page({\n  data: {\n    activeNames: ['1'],\n  },\n  onChange(event) {\n    this.setData({\n      activeNames: event.detail,\n    });\n  },\n  onOpen(event) {\n    Toast(`展开: ${event.detail}`);\n  },\n  onClose(event) {\n    Toast(`关闭: ${event.detail}`);\n  },\n});\n

自定义标题内容

<van-collapse value="{{ activeNames }}" bind:change="onChange">\n  <van-collapse-item name="1">\n    <view slot="title">有赞微商城<van-icon name="question-o" /></view>\n    提供多样店铺模板,快速搭建网上商城\n  </van-collapse-item>\n  <van-collapse-item title="有赞零售" name="2" icon="shop-o">\n    网店吸粉获客、会员分层营销、一机多种收款,告别经营低效和客户流失\n  </van-collapse-item>\n</van-collapse>\n
Page({\n  data: {\n    activeNames: ['1'],\n  },\n  onChange(event) {\n    this.setData({\n      activeNames: event.detail,\n    });\n  },\n});\n

API

Collapse Props

参数说明类型默认值
value当前展开面板的 name非手风琴模式:(string | number)[]
手风琴模式:string | number
-
accordion是否开启手风琴模式booleanfalse
border是否显示外边框booleantrue

Collapse Event

事件名说明参数
change切换面板时触发activeNames: string | Array
open展开面板时触发currentName: string | number
close关闭面板时触发currentName: string | number

CollapseItem Props

参数说明类型默认值
name唯一标识符,默认为索引值string | numberindex
title标题栏左侧内容string | number-
icon标题栏左侧图标名称或图片链接,可选值见 Icon 组件string-
value标题栏右侧内容string | number-
label标题栏描述信息string-
border是否显示内边框booleantrue
is-link是否展示标题栏右侧箭头并开启点击反馈booleantrue
clickable是否开启点击反馈booleanfalse
disabled是否禁用面板booleanfalse

CollapseItem Slot

名称说明
-面板内容
value自定义显示内容
icon自定义icon
title自定义title
right-icon自定义右侧按钮,默认是arrow

Collapse 外部样式类

类名说明
custom-class根节点样式类

CollapseItem 外部样式类

类名说明
custom-class根节点样式类
content-class内容样式类
',15)],ur={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",ir,hr)))},gr={class:"van-doc-markdown-body"},jr=[wn('

内置样式

介绍

Vant 中默认包含了一些常用样式,可以直接通过 className 的方式使用。

引入

在 app.wxss 中引入内置样式。

@import '@vant/weapp/common/index.wxss';\n

代码演示

文字省略

当文本内容长度超过容器最大宽度时,自动省略多余的文本。

<view class="van-ellipsis">\n  这是一段宽度限制 250px 的文字,后面的内容会省略。\n</view>\n\n<!-- 最多显示两行 -->\n<view class="van-multi-ellipsis--l2">\n  这是一段最多显示两行的文字,后面的内容会省略。\n</view>\n\n<!-- 最多显示三行 -->\n<view class="van-multi-ellipsis--l3">\n  这是一段最多显示三行的文字,后面的内容会省略。\n</view>\n

1px 边框

为元素添加 Retina 屏幕下的 1px 边框(即 hairline),基于伪类 transform 实现。

<!-- 上边框 -->\n<view class="van-hairline--top"></view>\n\n<!-- 下边框 -->\n<view class="van-hairline--bottom"></view>\n\n<!-- 左边框 -->\n<view class="van-hairline--left"></view>\n\n<!-- 右边框 -->\n<view class="van-hairline--right"></view>\n\n<!-- 上下边框 -->\n<view class="van-hairline--top-bottom"></view>\n\n<!-- 全边框 -->\n<view class="van-hairline--surround"></view>\n

全局字体

推荐在 app.wxss 中设置以下全局字体,以保证在不同设备上提供最佳的视觉体验。

page {\n  font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Helvetica,\n    Segoe UI, Arial, Roboto, 'PingFang SC', 'miui', 'Hiragino Sans GB', 'Microsoft Yahei',\n    sans-serif;\n}\n
',7)],mr={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",gr,jr)))},vr={class:"van-doc-markdown-body"},br=[wn('

ConfigProvider 全局配置

介绍

用于配置 Vant Weapp 组件的主题样式,从 v1.7.0 版本开始支持。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-config-provider": "@vant/weapp/config-provider/index"\n}\n

定制主题

介绍

Vant Weapp 组件通过丰富的 CSS 变量 来组织样式,通过覆盖这些 CSS 变量,可以实现定制主题、动态切换主题等效果。

示例

以 Button 组件为例,查看组件的样式,可以看到 .van-button--primary 类名上存在以下变量:

.van-button--primary {\n  color: var(--button-primary-color, #fff);\n  background: var(--button-primary-background-color, #07c160);\n  border: var(--button-border-width, 1px) solid var(\n      --button-primary-border-color,\n      #07c160\n    );\n}\n

自定义 CSS 变量

通过 CSS 覆盖

你可以直接在代码中覆盖这些 CSS 变量,Button 组件的样式会随之发生改变:

/* 添加这段样式后,Primary Button 会变成红色 */\npage {\n  --button-primary-background-color: red;\n}\n

通过 ConfigProvider 覆盖

ConfigProvider 组件提供了覆盖 CSS 变量的能力,你需要在根节点包裹一个 ConfigProvider 组件,并通过 theme-vars 属性来配置一些主题变量。

<van-config-provider theme-vars="{{ themeVars }}">\n  <van-cell-group>\n    <van-field label="评分">\n      <view slot="input" style="width: 100%">\n        <van-rate\n          model:value="{{ rate }}"\n          data-key="rate"\n          bind:change="onChange"\n        />\n      </view>\n    </van-field>\n    <van-field label="滑块" border="{{ false }}">\n      <view slot="input" style="width: 100%">\n        <van-slider\n          value="{{ slider }}"\n          data-key="slider"\n          bind:change="onChange"\n        />\n      </view>\n    </van-field>\n  </van-cell-group>\n\n  <view style="margin: 16px">\n    <van-button round block type="primary">提交</van-button>\n  </view>\n</van-config-provider>\n
import Page from '../../common/page';\n\nPage({\n  data: {\n    rate: 4,\n    slider: 50,\n    themeVars: {\n      rateIconFullColor: '#07c160',\n      sliderBarHeight: '4px',\n      sliderButtonWidth: '20px',\n      sliderButtonHeight: '20px',\n      sliderActiveBackgroundColor: '#07c160',\n      buttonPrimaryBorderColor: '#07c160',\n      buttonPrimaryBackgroundColor: '#07c160',\n    },\n  },\n\n  onChange(event) {\n    const { key } = event.currentTarget.dataset;\n    this.setData({\n      [key]: event.detail,\n    });\n  },\n});\n

API

Props

参数说明类型默认值
theme-vars自定义主题变量object-
',8)],fr={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",vr,br)))},yr={class:"van-doc-markdown-body"},qr=[wn('

CountDown 倒计时

介绍

用于实时展示倒计时数值,支持毫秒精度。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-count-down": "@vant/weapp/count-down/index"\n}\n

Vant Weapp 1.0 版本开始支持此组件,升级方式参见快速上手

代码演示

基本用法

time属性表示倒计时总时长,单位为毫秒。

<van-count-down time="{{ time }}" />\n
Page({\n  data: {\n    time: 30 * 60 * 60 * 1000,\n  },\n});\n

自定义格式

通过format属性设置倒计时文本的内容。

<van-count-down time="{{ time }}" format="DD 天 HH 时 mm 分 ss 秒" />\n

毫秒级渲染

倒计时默认每秒渲染一次,设置millisecond属性可以开启毫秒级渲染。

<van-count-down millisecond time="{{ time }}" format="HH:mm:ss:SSS" />\n

自定义样式

设置use-slot属性后可以自定义倒计时样式,需要通过bind:change事件获取timeData对象并自行渲染,格式见下方表格。

<van-count-down use-slot time="{{ time }}" bind:change="onChange">\n  <text class="item">{{ timeData.hours }}</text>\n  <text class="item">{{ timeData.minutes }}</text>\n  <text class="item">{{ timeData.seconds }}</text>\n</van-count-down>\n
Page({\n  data: {\n    time: 30 * 60 * 60 * 1000,\n    timeData: {},\n  },\n\n  onChange(e) {\n    this.setData({\n      timeData: e.detail,\n    });\n  },\n});\n
.item {\n  display: inline-block;\n  width: 22px;\n  margin-right: 5px;\n  color: #fff;\n  font-size: 12px;\n  text-align: center;\n  background-color: #1989fa;\n  border-radius: 2px;\n}\n

手动控制

通过 selectComponent 选择器获取到组件实例后,可以调用startpausereset方法。

<van-count-down\n  class="control-count-down"\n  millisecond\n  time="{{ 3000 }}"\n  auto-start="{{ false }}"\n  format="ss:SSS"\n  bind:finish="finished"\n/>\n\n<van-grid clickable column-num="3">\n  <van-grid-item text="开始" icon="play-circle-o" bindclick="start" />\n  <van-grid-item text="暂停" icon="pause-circle-o" bindclick="pause" />\n  <van-grid-item text="重置" icon="replay" bindclick="reset" />\n</van-grid>\n
Page({\n  start() {\n    const countDown = this.selectComponent('.control-count-down');\n    countDown.start();\n  },\n\n  pause() {\n    const countDown = this.selectComponent('.control-count-down');\n    countDown.pause();\n  },\n\n  reset() {\n    const countDown = this.selectComponent('.control-count-down');\n    countDown.reset();\n  },\n\n  finished() {\n    Toast('倒计时结束');\n  },\n});\n

API

Props

参数说明类型默认值
time倒计时时长,单位毫秒number-
format时间格式,DD-日,HH-时,mm-分,ss-秒,SSS-毫秒stringHH:mm:ss
auto-start是否自动开始倒计时booleantrue
millisecond是否开启毫秒级渲染booleanfalse
use-slot是否使用自定义样式插槽booleanfalse

Events

事件名说明回调参数
finish倒计时结束时触发-
change时间变化时触发,仅在开启use-slot后才会触发timeData

timeData 格式

名称说明类型
days剩余天数number
hours剩余小时number
minutes剩余分钟number
seconds剩余秒数number
milliseconds剩余毫秒number

方法

通过 selectComponent 可以获取到 CountDown 实例并调用实例方法。

方法名参数返回值介绍
start--开始倒计时
pause--暂停倒计时
reset--重设倒计时,若auto-starttrue,重设后会自动开始倒计时
',14)],xr={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",yr,qr)))},wr={class:"van-doc-markdown-body"},_r=[wn('

DatetimePicker 时间选择

介绍

用于选择时间,支持日期、时分等时间维度,通常与 弹出层 组件配合使用。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-datetime-picker": "@vant/weapp/datetime-picker/index"\n}\n

代码演示

选择完整时间

value 为时间戳。

<van-datetime-picker\n  type="datetime"\n  value="{{ currentDate }}"\n  min-date="{{ minDate }}"\n  max-date="{{ maxDate }}"\n  bind:input="onInput"\n/>\n
Page({\n  data: {\n    minHour: 10,\n    maxHour: 20,\n    minDate: new Date().getTime(),\n    maxDate: new Date(2019, 10, 1).getTime(),\n    currentDate: new Date().getTime(),\n  },\n\n  onInput(event) {\n    this.setData({\n      currentDate: event.detail,\n    });\n  },\n});\n

选择日期(年月日)

value 为时间戳,通过传入 formatter 函数对选项文字进行处理。

<van-datetime-picker\n  type="date"\n  value="{{ currentDate }}"\n  bind:input="onInput"\n  min-date="{{ minDate }}"\n  formatter="{{ formatter }}"\n/>\n
Page({\n  data: {\n    currentDate: new Date().getTime(),\n    minDate: new Date().getTime(),\n    formatter(type, value) {\n      if (type === 'year') {\n        return `${value}年`;\n      }\n      if (type === 'month') {\n        return `${value}月`;\n      }\n      return value;\n    },\n  },\n\n  onInput(event) {\n    this.setData({\n      currentDate: event.detail,\n    });\n  },\n});\n

选择日期(年月)

value 为时间戳。

<van-datetime-picker\n  type="year-month"\n  value="{{ currentDate }}"\n  min-date="{{ minDate }}"\n  bind:input="onInput"\n/>\n
Page({\n  data: {\n    currentDate: new Date().getTime(),\n    minDate: new Date().getTime(),\n  },\n\n  onInput(event) {\n    this.setData({\n      currentDate: event.detail,\n    });\n  },\n});\n

选择时间

value 为字符串。

<van-datetime-picker\n  type="time"\n  value="{{ currentDate }}"\n  min-hour="{{ minHour }}"\n  max-hour="{{ maxHour }}"\n  bind:input="onInput"\n/>\n
Page({\n  data: {\n    currentDate: '12:00',\n    minHour: 10,\n    maxHour: 20,\n  },\n\n  onInput(event) {\n    this.setData({\n      currentDate: event.detail,\n    });\n  },\n});\n

选项过滤器

通过传入 filter 函数,可以对选项数组进行过滤,实现自定义时间间隔。

<van-datetime-picker\n  type="time"\n  value="{{ currentDate }}"\n  filter="{{ filter }}"\n/>\n
Page({\n  data: {\n    currentDate: '12:00',\n    filter(type, options) {\n      if (type === 'minute') {\n        return options.filter((option) => option % 5 === 0);\n      }\n\n      return options;\n    },\n  },\n});\n

API

Props

参数说明类型默认值
value当前选中值string | number-
type类型,可选值为 date time year-month
不建议动态修改
stringdatetime
min-date可选的最小时间,精确到分钟number十年前
max-date可选的最大时间,精确到分钟number十年后
min-hour可选的最小小时,针对 time 类型number0
max-hour可选的最大小时,针对 time 类型number23
min-minute可选的最小分钟,针对 time 类型number0
max-minute可选的最大分钟,针对 time 类型number59
filter选项过滤函数(type, values) => values-
formatter选项格式化函数(type, value) => value-
title顶部栏标题string''
show-toolbar是否显示顶部栏booleantrue
loading是否显示加载状态booleanfalse
item-height选项高度number44
confirm-button-text确认按钮文字string确认
cancel-button-text取消按钮文字string取消
visible-item-count可见的选项个数number6

Events

事件名称说明回调参数
input当值变化时触发的事件当前 value
change当值变化时触发的事件组件实例
confirm点击完成按钮时触发的事件当前 value
cancel点击取消按钮时触发的事件-

change 事件

change事件中,可以获取到组件实例,对组件进行相应的更新等操作:

函数说明
getColumnValue(index)获取对应列中选中的值
setColumnValue(index, value)设置对应列中选中的值
getColumnValues(index)获取对应列中所有的备选值
setColumnValues(index, values)设置对应列中所有的备选值
getValues()获取所有列中被选中的值,返回一个数组
setValues(values)values为一个数组,设置所有列中被选中的值

外部样式类

类名说明
active-class选中项样式类
toolbar-class顶部栏样式类
column-class列样式类
',14)],kr={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",wr,_r)))},Sr={class:"van-doc-markdown-body"},Cr=[wn('

Dialog 弹出框

介绍

弹出模态框,常用于消息提示、消息确认,或在当前页面内完成特定的交互操作,支持函数调用和组件调用两种方式。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-dialog": "@vant/weapp/dialog/index"\n}\n

代码演示

消息提示

用于提示一些消息,只包含一个确认按钮。

<van-dialog id="van-dialog" />\n
import Dialog from 'path/to/@vant/weapp/dist/dialog/dialog';\n\nDialog.alert({\n  title: '标题',\n  message: '弹窗内容',\n}).then(() => {\n  // on close\n});\n\nDialog.alert({\n  message: '弹窗内容',\n}).then(() => {\n  // on close\n});\n

消息确认

用于确认消息,包含取消和确认按钮。

<van-dialog id="van-dialog" />\n
import Dialog from 'path/to/@vant/weapp/dist/dialog/dialog';\n\nDialog.confirm({\n  title: '标题',\n  message: '弹窗内容',\n})\n  .then(() => {\n    // on confirm\n  })\n  .catch(() => {\n    // on cancel\n  });\n

圆角按钮风格

将 theme 选项设置为 round-button 可以展示圆角按钮风格的弹窗。

<van-dialog id="van-dialog" />\n
import Dialog from 'path/to/@vant/weapp/dist/dialog/dialog';\n\nDialog.alert({\n  title: '标题',\n  message: '弹窗内容',\n  theme: 'round-button',\n}).then(() => {\n  // on close\n});\n\nDialog.alert({\n  message: '弹窗内容',\n  theme: 'round-button',\n}).then(() => {\n  // on close\n});\n

异步关闭

通过 beforeClose 属性可以传入一个回调函数,在弹窗关闭前进行特定操作。

<van-dialog id="van-dialog" />\n
import Dialog from 'path/to/@vant/weapp/dist/dialog/dialog';\n\nconst beforeClose = (action) => new Promise((resolve) => {\n  setTimeout(() => {\n    if (action === 'confirm') {\n      resolve(true);\n    } else {\n      // 拦截取消操作\n      resolve(false);\n    }\n  }, 1000);\n});\n\nDialog.confirm({\n  title: '标题',\n  message: '弹窗内容'\n  beforeClose\n});\n

组件调用

如果需要在弹窗内嵌入组件或其他自定义内容,可以使用组件调用的方式。

<van-dialog\n  use-slot\n  title="标题"\n  show="{{ show }}"\n  show-cancel-button\n  confirm-button-open-type="getUserInfo"\n  bind:close="onClose"\n  bind:getuserinfo="getUserInfo"\n>\n  <image src="https://img.yzcdn.cn/1.jpg" />\n</van-dialog>\n
Page({\n  data: {\n    show: true,\n  },\n\n  getUserInfo(event) {\n    console.log(event.detail);\n  },\n\n  onClose() {\n    this.setData({ show: false });\n  },\n});\n

API

方法

方法名参数返回值介绍
DialogoptionsPromise展示弹窗
Dialog.alertoptionsPromise展示消息提示弹窗
Dialog.confirmoptionsPromise展示消息确认弹窗
Dialog.setDefaultOptionsoptionsvoid修改默认配置,对所有 Dialog 生效
Dialog.resetDefaultOptions-void重置默认配置,对所有 Dialog 生效
Dialog.close-void关闭弹窗
Dialog.stopLoading-void停止按钮的加载状态

Options

通过函数调用 Dialog 时,支持传入以下选项:

参数说明类型默认值
title标题string-
width弹窗宽度,默认单位为pxstring | number320px
message文本内容,支持通过\\n换行string-
messageAlign内容对齐方式,可选值为left rightstringcenter
theme样式风格,可选值为round-buttonstringdefault
zIndexz-index 层级number100
className自定义类名,dialog 在自定义组件内时无效string‘’
customStyle自定义样式string‘’
selector自定义选择器stringvan-dialog
showConfirmButton是否展示确认按钮booleantrue
showCancelButton是否展示取消按钮booleanfalse
confirmButtonText确认按钮的文案string确认
cancelButtonText取消按钮的文案string取消
overlay是否展示遮罩层booleantrue
overlayStyle自定义遮罩层样式object-
closeOnClickOverlay点击遮罩层时是否关闭弹窗booleanfalse
asyncClose已废弃,将在 2.0.0 移除,请使用 beforeClose 属性代替booleanfalse
beforeClose关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(action) => boolean | Promise<boolean>-
context选择器的选择范围,可以传入自定义组件的 this 作为上下文object当前页面
transition动画名称,可选值为fade nonestringscale
confirmButtonOpenType确认按钮的微信开放能力,具体支持可参考 微信官方文档string-

OpenType Options

使用confirmButtonOpenType后,支持以下选项:

参数说明类型默认值open-type
appParameter打开 APP 时,向 APP 传递的参数string-launchApp
lang指定返回用户信息的语言,zh_CN 简体中文,
zh_TW 繁体中文,en 英文
stringengetUserInfo
sessionFrom会话来源string-contact
businessId客服消息子商户 idnumber-contact
sendMessageTitle会话内消息卡片标题string当前标题contact
sendMessagePath会话内消息卡片点击跳转小程序路径string当前分享路径contact
sendMessageImgsendMessageImgstring截图contact
showMessageCard显示会话内消息卡片stringfalsecontact

Props

通过组件调用 Dialog 时,支持以下 Props:

参数说明类型默认值
show是否显示弹窗boolean-
title标题string-
width弹窗宽度,默认单位为pxstring | number320px
message文本内容,支持通过\\n换行string-
theme样式风格,可选值为round-buttonstringdefault
message-align内容对齐方式,可选值为left rightstringcenter
z-indexz-index 层级number100
class-name自定义类名,dialog 在自定义组件内时无效string‘’
custom-style自定义样式string‘’
show-confirm-button是否展示确认按钮booleantrue
show-cancel-button是否展示取消按钮booleanfalse
confirm-button-text确认按钮的文案string确认
cancel-button-text取消按钮的文案string取消
confirm-button-color确认按钮的字体颜色string#ee0a24
cancel-button-color取消按钮的字体颜色string#333
overlay是否展示遮罩层booleantrue
overlay-style v1.0.0自定义遮罩层样式object-
close-on-click-overlay点击遮罩层时是否关闭弹窗booleanfalse
use-slot是否使用自定义内容的插槽booleanfalse
use-title-slot是否使用自定义标题的插槽booleanfalse
async-close已废弃,将在 2.0.0 移除,请使用 beforeClose 属性代替booleanfalse
before-close关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(action) => boolean | Promise<boolean>-
transition动画名称,可选值为fadestringscale
confirm-button-open-type确认按钮的微信开放能力,具体支持可参考 微信官方文档string-

OpenType Props

使用confirm-button-open-type后,支持以下 Props:

参数说明类型默认值open-type
app-parameter打开 APP 时,向 APP 传递的参数string-launchApp
lang指定返回用户信息的语言,zh_CN 简体中文,
zh_TW 繁体中文,en 英文
stringengetUserInfo
session-from会话来源string-contact
business-id客服消息子商户 idnumber-contact
send-message-title会话内消息卡片标题string当前标题contact
send-message-path会话内消息卡片点击跳转小程序路径string当前分享路径contact
send-message-imgsendMessageImgstring截图contact
show-message-card显示会话内消息卡片stringfalsecontact

Events

事件说明回调参数
bind:close弹窗关闭时触发event.detail: 触发关闭事件的来源,
枚举为confirm,cancel,overlay
bind:confirm点击确认按钮时触发-
bind:cancel点击取消按钮时触发-
bind:getuserinfo点击确认按钮时,会返回获取到的用户信息,
从返回参数的 detail 中获取到的值同 wx.getUserInfo
-
bind:contact客服消息回调-
bind:getphonenumber获取用户手机号回调-
bind:error当使用开放能力时,发生错误的回调-
bind:opensetting在打开授权设置页后回调-

Slot

名称说明
title自定义title显示内容,如果设置了title属性则不生效
',17)],zr={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Sr,Cr)))},Pr={class:"van-doc-markdown-body"},Ir=[wn('

Divider 分割线

介绍

用于将内容分隔为多个区域。

引入

app.jsonindex.json中引入组件,默认为ES6版本,ES5引入方式参见快速上手

"usingComponents": {\n  "van-divider": "@vant/weapp/divider/index"\n}\n

Vant Weapp 1.0 版本开始支持此组件,升级方式参见快速上手

代码演示

基础用法

<van-divider />\n

使用 hairline

<van-divider hairline />\n

虚线

<van-divider dashed />\n

文本位置

<van-divider contentPosition="center">文本</van-divider>\n<van-divider contentPosition="left">文本</van-divider>\n<van-divider contentPosition="right">文本</van-divider>\n

自定义属性

<van-divider contentPosition="center" textColor="#1989fa">文本颜色</van-divider>\n<van-divider contentPosition="center" borderColor="#1989fa">\n  border 颜色\n</van-divider>\n<van-divider contentPosition="center" fontSize="18">字体大小</van-divider>\n

自定义样式

<van-divider\n  contentPosition="center"\n  customStyle="color: #1989fa; border-color: #1989fa; font-size: 18px;"\n>\n  文本\n</van-divider>\n

API

Props

参数说明类型默认值
dashed虚线booleanfalse
hairline细线booleanfalse
content-position文本位置,left center rightstring-
custom-style自定义样式string-

Slot

名称说明
默认自定义文本内容
',13)],Or={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Pr,Ir)))},Er={class:"van-doc-markdown-body"},Dr=[wn('

DropdownMenu 下拉菜单

介绍

向下弹出的菜单列表。

引入

app.jsonindex.json中引入组件,默认为ES6版本,ES5引入方式参见快速上手

"usingComponents": {\n  "van-dropdown-menu": "@vant/weapp/dropdown-menu/index",\n  "van-dropdown-item": "@vant/weapp/dropdown-item/index"\n}\n

代码演示

基础用法

<van-dropdown-menu>\n  <van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" />\n  <van-dropdown-item value="{{ value2 }}" options="{{ option2 }}" />\n</van-dropdown-menu>\n
Page({\n  data: {\n    option1: [\n      { text: '全部商品', value: 0 },\n      { text: '新款商品', value: 1 },\n      { text: '活动商品', value: 2 },\n    ],\n    option2: [\n      { text: '默认排序', value: 'a' },\n      { text: '好评排序', value: 'b' },\n      { text: '销量排序', value: 'c' },\n    ],\n    value1: 0,\n    value2: 'a',\n  },\n});\n

自定义菜单内容

<van-dropdown-menu>\n  <van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" />\n  <van-dropdown-item id="item" title="{{ itemTitle }}">\n    <van-cell title="{{ switchTitle1 }}">\n      <van-switch\n        slot="right-icon"\n        size="24px"\n        style="height: 26px"\n        checked="{{ switch1 }}"\n        active-color="#ee0a24"\n        bind:change="onSwitch1Change"\n      />\n    </van-cell>\n    <van-cell title="{{ switchTitle2 }}">\n      <van-switch\n        slot="right-icon"\n        size="24px"\n        style="height: 26px"\n        checked="{{ switch2 }}"\n        active-color="#ee0a24"\n        bind:change="onSwitch2Change"\n      />\n    </van-cell>\n    <view style="padding: 5px 16px;">\n      <van-button type="danger" block round bind:click="onConfirm">\n        确认\n      </van-button>\n    </view>\n  </van-dropdown-item>\n</van-dropdown-menu>\n
Page({\n  data: {\n    switchTitle1: '包邮',\n    switchTitle2: '团购',\n    itemTitle: '筛选',\n    option1: [\n      { text: '全部商品', value: 0 },\n      { text: '新款商品', value: 1 },\n      { text: '活动商品', value: 2 },\n    ],\n    value1: 0,\n  },\n\n  onConfirm() {\n    this.selectComponent('#item').toggle();\n  },\n\n  onSwitch1Change({ detail }) {\n    this.setData({ switch1: detail });\n  },\n\n  onSwitch2Change({ detail }) {\n    this.setData({ switch2: detail });\n  },\n});\n

自定义选中状态颜色

<van-dropdown-menu active-color="#1989fa">\n  <van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" />\n  <van-dropdown-item value="{{ value2 }}" options="{{ option2 }}" />\n</van-dropdown-menu>\n

向上展开

<van-dropdown-menu direction="up">\n  <van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" />\n  <van-dropdown-item value="{{ value2 }}" options="{{ option2 }}" />\n</van-dropdown-menu>\n

禁用菜单

<van-dropdown-menu>\n  <van-dropdown-item value="{{ value1 }}" disabled options="{{ option1 }}" />\n  <van-dropdown-item value="{{ value2 }}" disabled options="{{ option2 }}" />\n</van-dropdown-menu>\n

API

参数说明类型默认值
active-color菜单标题和选项的选中态颜色string#ee0a24
z-index菜单栏 z-index 层级number10
duration动画时长,单位毫秒number200
direction菜单展开方向,可选值为 upstringdown
overlay是否显示遮罩层booleantrue
close-on-click-overlay是否在点击遮罩层后关闭菜单booleantrue
close-on-click-outside是否在点击外部 menu 后关闭菜单booleantrue
参数说明类型默认值
value当前选中项对应的 valuenumber | string-
title菜单项标题string当前选中项文字
options选项数组Option[][]
disabled是否禁用菜单booleanfalse
title-class标题额外类名string-
popup-style自定义弹出层样式string-
事件名说明回调参数
change点击选项导致 value 变化时触发value
open打开菜单栏时触发-
close关闭菜单栏时触发-
opened打开菜单栏且动画结束后触发-
closed关闭菜单栏且动画结束后触发-

通过 selectComponent(id) 可访问。

方法名说明参数返回值
toggle切换菜单展示状态,传true为显示,false为隐藏,不传参为取反show?: boolean-

Option 数据结构

键名说明类型
text文字string
value标识符number | string
icon左侧图标名称或图片链接string
',15)],Tr={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Er,Dr)))},Ar={class:"van-doc-markdown-body"},Nr=[wn('

Empty 空状态

介绍

空状态时的占位提示。

引入

app.jsonindex.json中引入组件,默认为ES6版本,ES5引入方式参见快速上手

"usingComponents": {\n  "van-empty": "@vant/weapp/empty/index"\n}\n

代码演示

基础用法

<van-empty description="描述文字" />\n

图片类型

Empty 组件内置了多种占位图片类型,可以在不同业务场景下使用。

<!-- 通用错误 -->\n<van-empty image="error" description="描述文字" />\n<!-- 网络错误 -->\n<van-empty image="network" description="描述文字" />\n<!-- 搜索提示 -->\n<van-empty image="search" description="描述文字" />\n

自定义图片

需要自定义图片时,可以在 image 属性中传入任意图片 URL。

<van-empty\n  class="custom-image"\n  image="https://img.yzcdn.cn/vant/custom-empty-image.png"\n  description="描述文字"\n/>\n

底部内容

通过默认插槽可以在 Empty 组件的下方插入内容。

<van-empty description="描述文字">\n  <van-button round type="danger" class="bottom-button">按钮</van-button>\n</van-empty>\n\n<style>\n  .bottom-button {\n    width: 160px;\n    height: 40px;\n  }\n</style>\n

API

Props

参数说明类型默认值
image图片类型,可选值为 error network search,支持传入图片 URLstringdefault
description图片下方的描述文字string-

Slots

名称说明
-自定义底部内容
image自定义图标
description自定义描述文字
',11)],Fr={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Ar,Nr)))},Lr={class:"van-doc-markdown-body"},Rr=[wn('

Field 输入框

介绍

用户可以在文本框内输入或编辑文字。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-field": "@vant/weapp/field/index"\n}\n

代码演示

基础用法

<van-cell-group>\n  <van-field\n    value="{{ value }}"\n    placeholder="请输入用户名"\n    border="{{ false }}"\n    bind:change="onChange"\n  />\n</van-cell-group>\n
Page({\n  data: {\n    value: '',\n  },\n\n  onChange(event) {\n    // event.detail 为当前输入的值\n    console.log(event.detail);\n  },\n});\n

双向绑定

最低基础库版本在 2.9.3 以上时,可以使用简易双向绑定

<van-cell-group>\n  <van-field\n    model:value="{{ value }}"\n    placeholder="请输入用户名"\n    border="{{ false }}"\n  />\n</van-cell-group>\n
Page({\n  data: {\n    value: '',\n  },\n});\n

自定义类型

根据type属性定义不同类型的输入框。

<van-cell-group>\n  <van-field\n    value="{{ username }}"\n    required\n    clearable\n    label="用户名"\n    icon="question-o"\n    placeholder="请输入用户名"\n    bind:click-icon="onClickIcon"\n  />\n\n  <van-field\n    value="{{ password }}"\n    type="password"\n    label="密码"\n    placeholder="请输入密码"\n    required\n    border="{{ false }}"\n  />\n</van-cell-group>\n

禁用输入框

<van-cell-group>\n  <van-field\n    value="输入框已禁用"\n    label="用户名"\n    left-icon="contact"\n    disabled\n    border="{{ false }}"\n  />\n</van-cell-group>\n

错误提示

通过error或者error-message属性增加对应的错误提示。

<van-cell-group>\n  <van-field\n    value="{{ username }}"\n    label="用户名"\n    placeholder="请输入用户名"\n    error\n  />\n  <van-field\n    value="{{ phone }}"\n    label="手机号"\n    placeholder="请输入手机号"\n    error-message="手机号格式错误"\n    border="{{ false }}"\n  />\n</van-cell-group>\n

内容对齐方式

可以通过input-align属性设置内容的对齐方式。

<van-cell-group>\n  <van-field\n    value="{{ username3 }}"\n    label="用户名"\n    placeholder="请输入用户名"\n    input-align="right"\n  />\n</van-cell-group>\n

高度自适应

对于 textarea,可以通过autosize属性设置高度自适应。

<van-cell-group>\n  <van-field\n    value="{{ message }}"\n    label="留言"\n    type="textarea"\n    placeholder="请输入留言"\n    autosize\n    border="{{ false }}"\n  />\n</van-cell-group>\n

插入按钮

通过 button slot 可以在输入框尾部插入按钮。

<van-cell-group>\n  <van-field\n    value="{{ sms }}"\n    center\n    clearable\n    label="短信验证码"\n    placeholder="请输入短信验证码"\n    border="{{ false }}"\n    use-button-slot\n  >\n    <van-button slot="button" size="small" type="primary">\n      发送验证码\n    </van-button>\n  </van-field>\n</van-cell-group>\n

常见问题

真机上为什么会出现聚焦时 placeholder 加粗、闪烁的现象?

由于微信小程序的 input 组件和 textarea 组件是原生组件,聚焦时会将原生的输入框覆盖在对应位置上,导致了这个现象的产生。

相关的讨论可以查看微信开放社区

真机上 placeholder 为什么会盖过 popup 等其它组件?

由于微信小程序的 input 组件和 textarea 组件是原生组件,遵循原生组件的限制,详情可以查看原生组件说明

textarea 的 placeholder 在真机上为什么会偏移?

微信小程序的 textarea 组件在 Android 和 iOS 中默认样式不同,在 iOS 中会有默认的 padding,且无法置 0。

同时 placeholder-stylevertical-alignline-height 等大量 css 属性都不生效。

这一系列的问题导致了 placeholder 在真机上可能会出现偏移。

微信已经在 2.10.0 基础库版本后支持移除默认的 padding,但低版本仍有问题。详情可以查看 微信开放社区

手写输入法为什么会丢失部分字符 / 手写输入法为什么不会触发 input 事件?

这是微信小程序的 input 组件本身的问题,如果需要兼容手写输入法的场景,可以在 blur 事件中取到输入的值。

相关的讨论可以查看微信开放社区

API

Props

参数说明类型默认值
name在表单内提交时的标识符string-
label输入框左侧文本string-
size单元格大小,可选值为 largestring-
value当前输入的值string | number-
type可设置为任意原生类型, 如 number idcard textarea digitstringtext
fixed如果 type 为 textarea 且在一个 position:fixed 的区域,需要显示指定属性 fixed 为 truebooleanfalse
focus获取焦点booleanfalse
border是否显示内边框booleantrue
disabled是否禁用输入框booleanfalse
readonly是否只读booleanfalse
clearable是否启用清除控件booleanfalse
clickable是否开启点击反馈booleanfalse
required是否显示表单必填星号booleanfalse
center是否使内容垂直居中booleanfalse
password是否是密码类型booleanfalse
title-width标题宽度string6.2em
maxlength最大输入长度,设置为 -1 的时候不限制最大长度number-1
placeholder输入框为空时占位符string-
placeholder-style指定 placeholder 的样式string-
custom-style自定义样式string-
is-link是否展示右侧箭头并开启点击反馈booleanfalse
arrow-direction箭头方向,可选值为 left up downstring-
show-word-limit是否显示字数统计,需要设置maxlength属性booleanfalse
error是否将输入内容标红booleanfalse
error-message底部错误提示文案,为空时不展示string''
error-message-align底部错误提示文案对齐方式,可选值为 center rightstring''
input-align输入框内容对齐方式,可选值为 center rightstringleft
autosize是否自适应内容高度,只对 textarea 有效,
可传入对象,如 { maxHeight: 100, minHeight: 50 },
单位为px
boolean | objectfalse
left-icon左侧图标名称或图片链接,可选值见 Icon 组件string-
right-icon右侧图标名称或图片链接,可选值见 Icon 组件string-
confirm-type设置键盘右下角按钮的文字,仅在 type=‘text’ 时生效stringdone
confirm-hold点击键盘右下角按钮时是否保持键盘不收起,在 type=‘textarea’ 时无效booleanfalse
hold-keyboardfocus 时,点击页面的时候不收起键盘booleanfalse
cursor-spacing输入框聚焦时底部与键盘的距离number50
adjust-position键盘弹起时,是否自动上推页面booleantrue
show-confirm-bar是否显示键盘上方带有”完成“按钮那一栏,只对 textarea 有效booleantrue
selection-start光标起始位置,自动聚集时有效,需与 selection-end 搭配使用number-1
selection-end光标结束位置,自动聚集时有效,需与 selection-start 搭配使用number-1
auto-focus自动聚焦,拉起键盘booleanfalse
disable-default-padding是否去掉 iOS 下的默认内边距,只对 textarea 有效booleantrue
cursor指定 focus 时的光标位置number-1
clear-trigger v1.8.4显示清除图标的时机,always 表示输入框不为空时展示,
focus 表示输入框聚焦且不为空时展示
stringfocus

Events

事件说明回调参数
bind:input输入内容时触发event.detail: 当前输入值
bind:change输入内容时触发event.detail: 当前输入值
bind:confirm点击完成按钮时触发event.detail: 当前输入值
bind:click-icon点击尾部图标时触发-
bind:focus输入框聚焦时触发event.detail.value: 当前输入值;
event.detail.height: 键盘高度
bind:blur输入框失焦时触发event.detail.value: 当前输入值;
event.detail.cursor: 游标位置(如果 type 不为 textarea,值为 0)
bind:clear点击清空控件时触发-
bind:click-input点击输入区域时触发-
bind:linechange输入框行数变化时调用,只对 textarea 有效event.detail = { height: 0, heightRpx: 0, lineCount: 0 }
bind:keyboardheightchange键盘高度发生变化的时候触发此事件event.detail = { height: height, duration: duration }

Slot

名称说明
label自定义输入框标签,如果设置了label属性则不生效
left-icon自定义输入框头部图标
right-icon自定义输入框尾部图标
button自定义输入框尾部按钮
input自定义输入框,使用此插槽后,与输入框相关的属性和事件将失效

外部样式类

类名说明
label-class左侧文本样式类
input-class输入框样式类
right-icon-class右侧图标样式类
',22)],Br={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Lr,Rr)))},Mr={class:"van-doc-markdown-body"},$r=[wn('

GoodsAction 商品导航

介绍

用于为商品相关操作提供便捷交互。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-goods-action": "@vant/weapp/goods-action/index",\n  "van-goods-action-icon": "@vant/weapp/goods-action-icon/index",\n  "van-goods-action-button": "@vant/weapp/goods-action-button/index"\n}\n

Vant Weapp 1.0 版本开始支持此组件,升级方式参见快速上手

代码演示

基础用法

<van-goods-action>\n  <van-goods-action-icon icon="chat-o" text="客服" bind:click="onClickIcon" />\n  <van-goods-action-icon icon="cart-o" text="购物车" bind:click="onClickIcon" />\n  <van-goods-action-button\n    text="加入购物车"\n    type="warning"\n    bind:click="onClickButton"\n  />\n  <van-goods-action-button text="立即购买" bind:click="onClickButton" />\n</van-goods-action>\n
Page({\n  onClickIcon() {\n    Toast('点击图标');\n  },\n\n  onClickButton() {\n    Toast('点击按钮');\n  },\n});\n

提示信息

设置dot属性后,会在图标右上角展示一个小红点。设置info属性后,会在图标右上角展示相应的徽标。

<van-goods-action>\n  <van-goods-action-icon icon="chat-o" text="客服" dot />\n  <van-goods-action-icon icon="cart-o" text="购物车" info="5" />\n  <van-goods-action-icon icon="shop-o" text="店铺" />\n  <van-goods-action-button text="加入购物车" type="warning" />\n  <van-goods-action-button text="立即购买" />\n</van-goods-action>\n

自定义按钮颜色

通过color属性可以自定义按钮的颜色,支持传入linear-gradient渐变色。

<van-goods-action>\n  <van-goods-action-icon icon="chat-o" text="客服" />\n  <van-goods-action-icon icon="cart-o" text="购物车" info="5" />\n  <van-goods-action-icon icon="shop-o" text="店铺" />\n  <van-goods-action-button color="#be99ff" text="加入购物车" type="warning" />\n  <van-goods-action-button color="#7232dd" text="立即购买" />\n</van-goods-action>\n

朴素按钮

通过plain属性将按钮设置为朴素按钮,朴素按钮的文字为按钮颜色,背景为白色。

<van-goods-action>\n  <van-goods-action-icon icon="chat-o" text="客服" />\n  <van-goods-action-icon icon="cart-o" text="购物车" info="5" />\n  <van-goods-action-icon icon="shop-o" text="店铺" />\n  <van-goods-action-button color="#7232dd" text="加入购物" type="warning" />\n  <van-goods-action-button plain color="#7232dd" text="立即购买" />\n</van-goods-action>\n

API

GoodsAction Props

参数说明类型默认值
safe-area-inset-bottom是否为 iPhoneX 留出底部安全距离booleantrue

GoodsActionIcon Props

参数说明类型默认值
text按钮文字string-
icon图标类型,可选值见icon组件string-
info图标右上角提示信息string | number-
url点击后跳转的链接地址string-
link-type链接跳转类型,可选值为 redirectTo switchTab reLaunchstringnavigateTo
id标识符string-
disabled是否禁用按钮booleanfalse
loading是否显示为加载状态booleanfalse
open-type微信开放能力,具体支持可参考 微信官方文档string-
app-parameter打开 APP 时,向 APP 传递的参数string-
lang指定返回用户信息的语言,zh_CN 简体中文,
zh_TW 繁体中文,en 英文
stringen
session-from会话来源string-
send-message-title会话内消息卡片标题string当前标题
send-message-path会话内消息卡片点击跳转小程序路径string当前分享路径
send-message-imgsendMessageImgstring截图
show-message-card显示会话内消息卡片stringfalse

GoodsActionButton Props

参数说明类型默认值
text按钮文字string-
color按钮颜色,支持传入 linear-gradient 渐变色string-
url点击后跳转的链接地址string-
link-type链接跳转类型,可选值为 redirectTo switchTab reLaunchstringnavigateTo
id标识符string-
type按钮类型,可选值为 primary warning dangerstringdanger
plain是否为朴素按钮booleanfalse
size按钮尺寸,可选值为 normal large small ministringnormal
disabled是否禁用按钮booleanfalse
loading是否显示为加载状态booleanfalse
open-type微信开放能力,具体支持可参考 微信官方文档string-
app-parameter打开 APP 时,向 APP 传递的参数string-
lang指定返回用户信息的语言,zh_CN 简体中文,
zh_TW 繁体中文,en 英文
stringen
session-from会话来源string-
send-message-title会话内消息卡片标题string当前标题
send-message-path会话内消息卡片点击跳转小程序路径string当前分享路径
send-message-imgsendMessageImgstring截图
show-message-card显示会话内消息卡片stringfalse

Events

事件名说明参数
click按钮点击事件回调-

GoodsActionIcon Slot

名称说明
icon自定义图标

GoodsActionButton Slot

名称说明
-按钮显示内容

GoodsActionIcon 外部样式类

类名说明
icon-class图标样式类
text-class文字样式类

GoodsActionButton 外部样式类

类名说明
custom-class根节点样式类
',17)],Ur={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Mr,$r)))},Vr={class:"van-doc-markdown-body"},Hr=[wn('

Grid 宫格

介绍

宫格可以在水平方向上把页面分隔成等宽度的区块,用于展示内容或进行页面导航。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-grid": "@vant/weapp/grid/index",\n  "van-grid-item": "@vant/weapp/grid-item/index"\n}\n

Vant Weapp 1.0 版本开始支持此组件,升级方式参见快速上手

代码演示

基本用法

通过icon属性设置格子内的图标,text属性设置文字内容。

<van-grid>\n  <van-grid-item icon="photo-o" text="文字" />\n  <van-grid-item icon="photo-o" text="文字" />\n  <van-grid-item icon="photo-o" text="文字" />\n  <van-grid-item icon="photo-o" text="文字" />\n</van-grid>\n

自定义列数

默认一行展示四个格子,可以通过column-num自定义列数。

<van-grid column-num="3">\n  <van-grid-item icon="photo-o" text="文字" wx:for="{{ 6 }}" />\n</van-grid>\n

自定义内容

通过插槽可以自定义格子展示的内容。

<van-grid column-num="3" border="{{ false }}">\n  <van-grid-item use-slot wx:for="{{ 3 }}" wx:for-item="index">\n    <image\n      style="width: 100%; height: 90px;"\n      src="https://img.yzcdn.cn/vant/apple-{{ index + 1 }}.jpg"\n    />\n  </van-grid-item>\n</van-grid>\n

正方形格子

设置square属性后,格子的高度会和宽度保持一致。

<van-grid square>\n  <van-grid-item icon="photo-o" text="文字" wx:for="{{ 8 }}" />\n</van-grid>\n

格子间距

通过gutter属性设置格子之间的距离。

<van-grid gutter="{{ 10 }}">\n  <van-grid-item icon="photo-o" text="文字" wx:for="{{ 8 }}" />\n</van-grid>\n

内容横排

direction属性设置为horizontal,可以让宫格的内容呈横向排列。

<van-grid direction="horizontal" column-num="2">\n  <van-grid-item icon="photo-o" text="文字" />\n  <van-grid-item icon="photo-o" text="文字" />\n  <van-grid-item icon="photo-o" text="文字" />\n</van-grid>\n

页面跳转

可以通过url属性进行页面跳转,通过link-type属性控制跳转类型。

<van-grid clickable column-num="2">\n  <van-grid-item\n    icon="home-o"\n    link-type="navigateTo"\n    url="/pages/dashboard/index"\n    text="Navigate 跳转"\n  />\n  <van-grid-item\n    icon="search"\n    link-type="reLaunch"\n    url="/pages/dashboard/index"\n    text="ReLaunch 跳转"\n  />\n</van-grid>\n

提示信息

设置dot属性后,会在图标右上角展示一个小红点。设置badge属性后,会在图标右上角展示相应的徽标。

<van-grid column-num="2">\n  <van-grid-item icon="home-o" text="文字" dot />\n  <van-grid-item icon="search" text="文字" badge="99+" />\n</van-grid>\n

API

Grid Props

参数说明类型默认值
column-num列数number4
icon-size v1.3.2图标大小,默认单位为pxstring28px
gutter格子之间的间距,默认单位为pxstring | number0
border是否显示边框booleantrue
center是否将格子内容居中显示booleantrue
square是否将格子固定为正方形booleanfalse
clickable是否开启格子点击反馈booleanfalse
direction格子内容排列的方向,可选值为 horizontalstringvertical
reverse v1.7.0是否调换图标和文本的位置booleanfalse
use-slot是否使用自定义内容的插槽booleanfalse

Grid 外部样式类

类名说明
custom-class根节点样式类

GridItem Props

参数说明类型默认值
text文字string-
icon图标名称或图片链接,可选值见 Icon 组件string-
icon-color图标颜色string-
icon-prefix v1.7.0第三方图标前缀stringvan-icon
dot是否显示图标右上角小红点booleanfalse
badge图标右上角徽标的内容string | number-
url点击后跳转的链接地址string-
link-type链接跳转类型,可选值为 redirectTo switchTab reLaunchstringnavigateTo

GridItem Events

事件名说明回调参数
bind:click点击格子时触发-

GridItem Slots

名称说明
-自定义宫格的所有内容,需要设置use-slot属性
icon自定义图标,如果设置了use-slot或者icon属性则不生效
text自定义文字,如果设置了use-slot或者text属性则不生效

GridItem 外部样式类

类名说明
custom-class根节点样式类
content-class内容样式类
icon-class图标样式类
text-class文本样式类
',19)],Wr={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Vr,Hr)))},Gr={class:"van-doc-markdown-body"},Kr=[wn('

Icon 图标

介绍

基于字体的图标集,可以通过 Icon 组件使用,也可以在其他组件中通过 icon 属性引用。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-icon": "@vant/weapp/icon/index"\n}\n

代码演示

基础用法

Iconname属性支持传入图标名称或图片链接。

<van-icon name="close" />\n<van-icon name="https://b.yzcdn.cn/vant/icon-demo-1126.png" />\n

提示信息

设置dot属性后,会在图标右上角展示一个小红点。设置info属性后,会在图标右上角展示相应的徽标。

<van-icon name="chat" dot />\n<van-icon name="chat" info="9" />\n<van-icon name="chat" info="99+" />\n

图标颜色

设置color属性来控制图标颜色。

<van-icon name="chat" color="red" />\n

图标大小

设置size属性来控制图标大小。

<van-icon name="chat" size="50px" />\n

自定义图标

如果需要在现有 Icon 的基础上使用更多图标,可以引入第三方 iconfont 对应的字体文件和 CSS 文件,之后就可以在 Icon 组件中直接使用。例如,可以在 app.wxss 文件中引入。

/* 引入第三方或自定义的字体图标样式 */\n@font-face {\n  font-family: 'my-icon';\n  src: url('./my-icon.ttf') format('truetype');\n}\n\n.my-icon {\n  font-family: 'my-icon';\n}\n\n.my-icon-extra::before {\n  content: '\\e626';\n}\n
<!-- 通过 class-prefix 指定类名为 my-icon -->\n<van-icon class-prefix="my-icon" name="extra" />\n

API

Props

参数说明类型默认值
name图标名称或图片链接string-
dot是否显示图标右上角小红点booleanfalse
info图标右上角文字提示string | number-
color图标颜色stringinherit
size图标大小,如 20px2em,默认单位为pxstring | numberinherit
custom-style自定义样式string-
class-prefix类名前缀stringvan-icon

Events

事件名说明参数
bind:click点击图标时触发-

外部样式类

类名说明
custom-class根节点样式类

常见问题

开发者工具上提示 Failed to load font 是什么情况?

这个是开发者工具本身的问题,可以忽略,具体可以查看微信小程序文档 - 注意事项第 5 条。

',15)],Qr={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Gr,Kr)))},Yr={class:"van-doc-markdown-body"},Xr=[wn('

Image 图片

介绍

增强版的 img 标签,提供多种图片填充模式,支持图片懒加载、加载中提示、加载失败提示。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-image": "@vant/weapp/image/index"\n}\n

Vant Weapp 1.0 版本开始支持此组件,升级方式参见快速上手

代码演示

基础用法

基础用法与原生 image 标签一致,可以设置srcwidthheight等原生属性。

<van-image width="100" height="100" src="https://img.yzcdn.cn/vant/cat.jpeg" />\n

填充模式

通过fit属性可以设置图片填充模式,可选值见下方表格。

<van-image\n  width="10rem"\n  height="10rem"\n  fit="contain"\n  src="https://img.yzcdn.cn/vant/cat.jpeg"\n/>\n

圆形图片

通过round属性可以设置图片变圆,注意当图片宽高不相等且fitcontainscale-down时,将无法填充一个完整的圆形。

<van-image\n  round\n  width="10rem"\n  height="10rem"\n  src="https://img.yzcdn.cn/vant/cat.jpeg"\n/>\n

图片懒加载

图片懒加载,在即将进入一定范围(上下三屏)时才开始加载。

<van-image\n  width="100"\n  height="100"\n  lazy-load\n  src="https://img.yzcdn.cn/vant/cat.jpeg"\n/>\n

加载中提示

Image组件提供了默认的加载中提示,支持通过loading插槽自定义内容。

<van-image use-loading-slot>\n  <van-loading slot="loading" type="spinner" size="20" vertical />\n</van-image>\n

加载失败提示

Image组件提供了默认的加载失败提示,支持通过error插槽自定义内容。

<van-image use-error-slot>\n  <text slot="error">加载失败</text>\n</van-image>\n

API

Props

参数说明类型默认值
src图片链接string-
fit图片填充模式stringfill
alt替代文本string-
width宽度,默认单位为pxstring | number-
height高度,默认单位为pxstring | number-
radius圆角大小,默认单位为pxstring | number0
round是否显示为圆形booleanfalse
lazy-load是否懒加载booleanfalse
show-error是否展示图片加载失败提示booleantrue
show-loading是否展示图片加载中提示booleantrue
use-error-slot是否使用 error 插槽booleanfalse
use-loading-slot是否使用 loading 插槽booleanfalse
show-menu-by-longpress是否开启长按图片显示识别小程序码菜单booleanfalse

图片填充模式 \b

名称含义
contain保持宽高缩放图片,使图片的长边能完全显示出来
cover保持宽高缩放图片,使图片的短边能完全显示出来,裁剪长边
fill拉伸图片,使图片填满元素
widthFix缩放模式,宽度不变,高度自动变化,保持原图宽高比不变
heightFix缩放模式,高度不变,宽度自动变化,保持原图宽高比不变
none保持图片原有尺寸

Events

事件名说明回调参数
click点击图片时触发event: Event
load图片加载完毕时触发event: Event
error图片加载失败时触发event: Event

Slots

名称说明
loading自定义加载中的提示内容
error自定义加载失败时的提示内容

外部样式类

类名说明
custom-class根节点样式类
image-class图片样式类
loading-classloading 样式类
error-classerror 样式类
',16)],Jr={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Yr,Xr)))},Zr={class:"van-doc-markdown-body"},si=[wn('

IndexBar 索引栏

介绍

用于列表的索引分类显示和快速定位。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-index-bar": "@vant/weapp/index-bar/index",\n  "van-index-anchor": "@vant/weapp/index-anchor/index"\n}\n

Vant Weapp 1.0 版本开始支持此组件,升级方式参见快速上手

代码演示

基础用法

点击索引栏时,会自动跳转到对应的IndexAnchor锚点位置。

<van-index-bar>\n  <view>\n    <van-index-anchor index="A" />\n    <van-cell title="文本" />\n    <van-cell title="文本" />\n    <van-cell title="文本" />\n  </view>\n\n  <view>\n    <van-index-anchor index="B" />\n    <van-cell title="文本" />\n    <van-cell title="文本" />\n    <van-cell title="文本" />\n  </view>\n\n  ...\n</van-index-bar>\n

自定义索引列表

可以通过index-list属性自定义展示的索引字符列表。

<van-index-bar index-list="{{ indexList }}">\n  <view>\n    <van-index-anchor index="1">标题1</van-index-anchor>\n    <van-cell title="文本" />\n    <van-cell title="文本" />\n    <van-cell title="文本" />\n  </view>\n\n  <view>\n    <van-index-anchor index="2">标题2</van-index-anchor>\n    <van-cell title="文本" />\n    <van-cell title="文本" />\n    <van-cell title="文本" />\n  </view>\n\n  ...\n</van-index-bar>\n
Page({\n  data: {\n    indexList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n  },\n});\n

API

IndexBar Props

参数说明类型默认值版本
index-list索引字符列表string[] | number[]A-Z-
z-indexz-index 层级number1-
sticky是否开启锚点自动吸顶booleantrue-
sticky-offset-top锚点自动吸顶时与顶部的距离number0-
highlight-color索引字符高亮颜色string#07c160-

IndexAnchor Props

参数说明类型默认值版本
use-slot是否使用自定义内容的插槽booleanfalse-
index索引字符string | number--

IndexBar Events

事件名说明回调参数
select选中字符时触发index: 索引字符

IndexAnchor Slots

名称说明
-锚点位置显示内容,默认为索引字符

常见问题

嵌套在滚动元素中 IndexAnchor 失效?

由于 <IndexBar /> 内部使用 wx.pageScrollTo 滚动到指定位置,因此只支持页面级滚动,无法在滚动元素中嵌套使用,例如:view 使用 overflow: scroll; 或者 scroll-view,具体可查看微信小程序文档。历史 issue: #4252

',13)],ai={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Zr,si)))},ti={class:"van-doc-markdown-body"},ni=[wn('

Loading 加载

介绍

加载图标,用于表示加载中的过渡状态。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-loading": "@vant/weapp/loading/index"\n}\n

代码演示

加载类型

<van-loading /> <van-loading type="spinner" />\n

自定义颜色

<van-loading color="#1989fa" /> <van-loading type="spinner" color="#1989fa" />\n

加载文案

<van-loading size="24px">加载中...</van-loading>\n

垂直排列

<van-loading size="24px" vertical>加载中...</van-loading>\n

API

Props

参数说明类型默认值
color颜色string#c9c9c9
type类型,可选值为 spinnerstringcircular
size加载图标大小,默认单位为 pxstring | number30px
text-size v1.0.0文字大小,默认单位为为 pxstring | number14px
vertical v1.0.0是否垂直排列图标和文字内容booleanfalse

Slots

名称说明
-加载文案

外部样式类

类名说明
custom-class根节点样式类
',12)],ei={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",ti,ni)))},li={class:"van-doc-markdown-body"},pi=[wn('

NavBar 导航栏

介绍

为页面提供导航功能,常用于页面顶部。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-nav-bar": "@vant/weapp/nav-bar/index"\n}\n

代码演示

基础用法

<van-nav-bar\n  title="标题"\n  left-text="返回"\n  right-text="按钮"\n  left-arrow\n  bind:click-left="onClickLeft"\n  bind:click-right="onClickRight"\n/>\n
Page({\n  onClickLeft() {\n    wx.showToast({ title: '点击返回', icon: 'none' });\n  },\n  onClickRight() {\n    wx.showToast({ title: '点击按钮', icon: 'none' });\n  },\n});\n

高级用法

通过 slot 定制内容。

<van-nav-bar title="标题" left-text="返回" left-arrow>\n  <van-icon name="search" slot="right" />\n</van-nav-bar>\n

API

Props

参数说明类型默认值
title标题string''
left-text左侧文案string''
right-text右侧文案string''
left-arrow是否显示左侧箭头booleanfalse
fixed是否固定在顶部booleanfalse
placeholder固定在顶部时是否开启占位booleanfalse
border是否显示下边框booleantrue
z-index元素 z-indexnumber1
custom-style根节点自定义样式string-
safe-area-inset-top是否留出顶部安全距离(状态栏高度)booleantrue

Slot

名称说明
title自定义标题
left自定义左侧区域内容
right自定义右侧区域内容

Events

事件名说明参数
bind:click-left点击左侧按钮时触发-
bind:click-right点击右侧按钮时触发-

外部样式类

类名说明
custom-class根节点样式类
title-class标题样式类
',11)],ci={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",li,pi)))},oi={class:"van-doc-markdown-body"},di=[wn('

NoticeBar 通知栏

介绍

用于循环播放展示一组消息通知。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-notice-bar": "@vant/weapp/notice-bar/index"\n}\n

代码演示

基础用法

<van-notice-bar\n  left-icon="volume-o"\n  text="在代码阅读过程中人们说脏话的频率是衡量代码质量的唯一标准。"\n/>\n

滚动播放

通知栏的内容长度溢出时会自动开启滚动播放,通过 scrollable 属性可以控制该行为。

<!-- 文字较短时,通过设置 scrollable 属性开启滚动播放 -->\n<van-notice-bar scrollable text="技术是开发它的人的共同灵魂。" />\n\n<!-- 文字较长时,通过禁用 scrollable 属性关闭滚动播放 -->\n<van-notice-bar\n  scrollable="{{ false }}"\n  text="在代码阅读过程中人们说脏话的频率是衡量代码质量的唯一标准。"\n/>\n

多行展示

文字较长时,可以通过设置 wrapable 属性来开启多行展示。

<van-notice-bar\n  wrapable\n  scrollable="{{ false }}"\n  text="在代码阅读过程中人们说脏话的频率是衡量代码质量的唯一标准。"\n/>\n

通知栏模式

通知栏支持 closeablelink 两种模式。

<!-- closeable 模式,在右侧显示关闭按钮 -->\n<van-notice-bar mode="closeable" text="技术是开发它的人的共同灵魂。" />\n\n<!-- link 模式,在右侧显示链接箭头 -->\n<van-notice-bar mode="link" text="技术是开发它的人的共同灵魂。" />\n

自定义样式

通过 color 属性设置文本颜色,通过 background 属性设置背景色。

<van-notice-bar\n  color="#1989fa"\n  background="#ecf9ff"\n  left-icon="info-o"\n  text="技术是开发它的人的共同灵魂。"\n/>\n

自定义滚动速率

使用speed属性控制滚动速率。

<van-notice-bar\n  text="{{ text }}"\n  speed="{{speedValue}}"\n  left-icon="//img.yzcdn.cn/public_files/2017/8/10/6af5b7168eed548100d9041f07b7c616.png"\n/>\n

API

Props

参数说明类型默认值
mode通知栏模式,可选值为 closeable linkstring''
text通知文本内容string''
color通知文本颜色string#ed6a0c
background滚动条背景string#fffbe8
left-icon左侧图标名称或图片链接string-
delay动画延迟时间 (s)number1
speed滚动速率 (px/s)number60
scrollable是否开启滚动播放,内容长度溢出时默认开启boolean-
wrapable是否开启文本换行,只在禁用滚动时生效booleanfalse
open-type微信开放能力stringnavigate

Events

事件名说明参数
click点击通知栏时触发event: Event
close关闭通知栏时触发event: Event

Slot

名称说明
-通知文本内容,仅在 text 属性为空时有效
left-icon自定义左侧图标
right-icon自定义右侧图标

外部样式类

类名说明
custom-class根节点样式类
',15)],ri={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",oi,di)))},ii={class:"van-doc-markdown-body"},hi=[wn('

Notify 消息提示

介绍

在页面顶部展示消息提示,支持函数调用和组件调用两种方式。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-notify": "@vant/weapp/notify/index"\n}\n

代码演示

基础用法

import Notify from 'path/to/@vant/weapp/dist/notify/notify';\n\nNotify('通知内容');\n
<!-- 在页面内添加对应的节点 -->\n<van-notify id="van-notify" />\n

通知类型

支持primarysuccesswarningdanger四种通知类型,默认为danger

// 主要通知\nNotify({ type: 'primary', message: '通知内容' });\n\n// 成功通知\nNotify({ type: 'success', message: '通知内容' });\n\n// 危险通知\nNotify({ type: 'danger', message: '通知内容' });\n\n// 警告通知\nNotify({ type: 'warning', message: '通知内容' });\n

自定义通知

自定义消息通知的颜色和展示时长。

Notify({\n  message: '自定义颜色',\n  color: '#ad0000',\n  background: '#ffe1e1',\n});\n\nNotify({\n  message: '自定义时长',\n  duration: 1000,\n});\n

自定义选择器

Notify({\n  message: '自定义节点选择器',\n  duration: 1000,\n  selector: '#custom-selector',\n});\n
<!-- 在页面内添加自定义节点 -->\n<van-notify id="custom-selector" />\n

API

方法

方法名说明参数返回值
Notify展示提示options | messagenotify 实例
Notify.clear关闭提示optionsvoid

Options

参数说明类型默认值
type v1.0.0类型,可选值为 primary success warningstringdanger
message v1.0.0展示文案,支持通过\\n换行string''
duration展示时长(ms),值为 0 时,notify 不会消失number3000
selector自定义节点选择器stringvan-notify
color字体颜色string#fff
top顶部距离number0
background背景颜色string-
context选择器的选择范围,可以传入自定义组件的 this 作为上下文object当前页面
onClick点击时的回调函数Function-
onOpened完全展示后的回调函数Function-
onClose关闭时的回调函数Function-
safeAreaInsetTop是否留出顶部安全距离(状态栏高度)booleanfalse
',11)],ui={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",ii,hi)))},gi={class:"van-doc-markdown-body"},ji=[wn('

Overlay 遮罩层

介绍

创建一个遮罩层,用于强调特定的页面元素,并阻止用户进行其他操作。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-overlay": "@vant/weapp/overlay/index"\n}\n

代码演示

基础用法

<van-button type="primary" bind:click="onClickShow">显示遮罩层</van-button>\n<van-overlay show="{{ show }}" bind:click="onClickHide" />\n
Page({\n  data: {\n    show: false,\n  },\n\n  onClickShow() {\n    this.setData({ show: true });\n  },\n\n  onClickHide() {\n    this.setData({ show: false });\n  },\n});\n

嵌入内容

通过默认插槽可以在遮罩层上嵌入任意内容。

<van-button type="primary" bind:click="onClickShow">嵌入内容</van-button>\n<van-overlay show="{{ show }}" bind:click="onClickHide">\n  <view class="wrapper">\n    <view class="block" catch:tap="noop" />\n  </view>\n</van-overlay>\n
Page({\n  data: {\n    show: false,\n  },\n\n  onClickShow() {\n    this.setData({ show: true });\n  },\n\n  onClickHide() {\n    this.setData({ show: false });\n  },\n\n  noop() {},\n});\n
.wrapper {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  height: 100%;\n}\n\n.block {\n  width: 120px;\n  height: 120px;\n  background-color: #fff;\n}\n

Props

参数说明类型默认值
show是否展示遮罩层booleanfalse
z-indexz-index 层级string | number1
duration动画时长,单位秒string | number0.3
class-name自定义类名string-
custom-style自定义样式string-
lock-scroll v1.7.3是否锁定背景滚动,锁定时蒙层里的内容也将无法滚动booleantrue

Events

事件名说明回调参数
bind:click点击时触发-

Slots

名称说明
-默认插槽,用于在遮罩层上方嵌入内容
',9)],mi={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",gi,ji)))},vi={class:"van-doc-markdown-body"},bi=[wn('

Panel 面板

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-panel": "@vant/weapp/panel/index"\n}\n

代码演示

基础用法

面板只是一个容器,里面可以放入自定义的内容。

<van-panel title="标题" desc="描述信息" status="状态">\n  <view>内容</view>\n</van-panel>\n

高级用法

使用slot自定义内容。

<van-panel title="标题" desc="描述信息" status="状态">\n  <view>内容</view>\n  <view slot="footer">\n    <van-button size="small">按钮</van-button>\n    <van-button size="small" type="danger">按钮</van-button>\n  </view>\n</van-panel>\n

API

Props

参数说明类型默认值
title标题string-
desc描述string-
status状态string-

Slot

名称说明
-自定义内容
header自定义 header,如果设置了titledescstatus属性则不生效
footer自定义 footer

外部样式类

类名说明
custom-class根节点样式类
header-class头部样式类
footer-class底部样式类
',9)],fi={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",vi,bi)))},yi={class:"van-doc-markdown-body"},qi=[wn('

Picker 选择器

介绍

提供多个选项集合供用户选择,支持单列选择和多列级联,通常与 弹出层 组件配合使用。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-picker": "@vant/weapp/picker/index"\n}\n

代码演示

基础用法

<van-picker columns="{{ columns }}" bind:change="onChange" />\n
import Toast from 'path/to/@vant/weapp/dist/toast/toast';\n\nPage({\n  data: {\n    columns: ['杭州', '宁波', '温州', '嘉兴', '湖州'],\n  },\n\n  onChange(event) {\n    const { picker, value, index } = event.detail;\n    Toast(`当前值:${value}, 当前索引:${index}`);\n  },\n});\n

默认选中项

单列选择器可以直接通过default-index属性设置初始选中项的索引值。

<van-picker\n  columns="{{ columns }}"\n  default-index="{{ 2 }}"\n  bind:change="onChange"\n/>\n

展示顶部栏

<van-picker\n  show-toolbar\n  title="标题"\n  columns="{{ columns }}"\n  bind:cancel="onCancel"\n  bind:confirm="onConfirm"\n/>\n
import Toast from 'path/to/@vant/weapp/dist/toast/toast';\n\nPage({\n  data: {\n    columns: ['杭州', '宁波', '温州', '嘉兴', '湖州'],\n  },\n\n  onConfirm(event) {\n    const { picker, value, index } = event.detail;\n    Toast(`当前值:${value}, 当前索引:${index}`);\n  },\n\n  onCancel() {\n    Toast('取消');\n  },\n});\n

多列联动

<van-picker columns="{{ columns }}" bind:change="onChange" />\n
const citys = {\n  浙江: ['杭州', '宁波', '温州', '嘉兴', '湖州'],\n  福建: ['福州', '厦门', '莆田', '三明', '泉州'],\n};\n\nPage({\n  data: {\n    columns: [\n      {\n        values: Object.keys(citys),\n        className: 'column1',\n      },\n      {\n        values: citys['浙江'],\n        className: 'column2',\n        defaultIndex: 2,\n      },\n    ],\n  },\n\n  onChange(event) {\n    const { picker, value, index } = event.detail;\n    picker.setColumnValues(1, citys[value[0]]);\n  },\n});\n

禁用选项

选项可以为对象结构,通过设置 disabled 来禁用该选项。

<van-picker columns="{{ columns }}" />\n
Page({\n  data: {\n    columns: [\n      { text: '杭州', disabled: true },\n      { text: '宁波' },\n      { text: '温州' },\n    ],\n  },\n});\n

加载状态

当 Picker 数据是通过异步获取时,可以通过 loading 属性显示加载提示。

<van-picker columns="{{ columns }}" loading />\n

API

Props

参数说明类型默认值
columns对象数组,配置每一列显示的数据Array[]
show-toolbar是否显示顶部栏booleanfalse
toolbar-position顶部栏位置,可选值为bottomstringtop
title顶部栏标题string''
loading是否显示加载状态booleanfalse
value-key选项对象中,文字对应的 keystringtext
item-height选项高度number44
confirm-button-text确认按钮文字string确认
cancel-button-text取消按钮文字string取消
visible-item-count可见的选项个数number6
default-index单列选择器的默认选中项索引,
多列选择器请参考下方的 Columns 配置
number0

Events

Picker 组件的事件会根据 columns 是单列或多列返回不同的参数。

事件名说明参数
confirm点击完成按钮时触发单列:选中值,选中值对应的索引
多列:所有列选中值,所有列选中值对应的索引
cancel点击取消按钮时触发单列:选中值,选中值对应的索引
多列:所有列选中值,所有列选中值对应的索引
change选项改变时触发单列:Picker 实例,选中值,选中值对应的索引
多列:Picker 实例,所有列选中值,当前列对应的索引

Columns 数据结构

当传入多列数据时,columns为一个对象数组,数组中的每一个对象配置每一列,每一列有以下key

key说明
values列中对应的备选值
defaultIndex初始选中项的索引,默认为 0

外部样式类

类名说明
custom-class根节点样式类
active-class选中项样式类
toolbar-class顶部栏样式类
column-class列样式类

方法

通过 selectComponent 可以获取到 picker 实例并调用实例方法。

方法名参数返回值介绍
getValues-values获取所有列选中的值
setValuesvalues-设置所有列选中的值
getIndexes-indexes获取所有列选中值对应的索引
setIndexesindexes-设置所有列选中值对应的索引
getColumnValuecolumnIndexvalue获取对应列选中的值
setColumnValuecolumnIndex, value-设置对应列选中的值
getColumnIndexcolumnIndexoptionIndex获取对应列选中项的索引
setColumnIndexcolumnIndex, optionIndex-设置对应列选中项的索引
getColumnValuescolumnIndexvalues获取对应列中所有选项
setColumnValuescolumnIndex, values-设置对应列中所有选项
',16)],xi={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",yi,qi)))},wi={class:"van-doc-markdown-body"},_i=[wn('

Popup 弹出层

介绍

弹出层容器,用于展示弹窗、信息提示等内容,支持多个弹出层叠加展示。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-popup": "@vant/weapp/popup/index"\n}\n

代码演示

基础用法

通过show属性控制弹出层是否展示。

<van-cell title="展示弹出层" is-link bind:click="showPopup" />\n\n<van-popup show="{{ show }}" bind:close="onClose">内容</van-popup>\n
Page({\n  data: {\n    show: false,\n  },\n\n  showPopup() {\n    this.setData({ show: true });\n  },\n\n  onClose() {\n    this.setData({ show: false });\n  },\n});\n

弹出位置

通过position属性设置弹出位置,默认居中弹出,可以设置为topbottomleftright

<van-popup\n  show="{{ show }}"\n  position="top"\n  custom-style="height: 20%;"\n  bind:close="onClose"\n/>\n

关闭图标

设置closeable属性后,会在弹出层的右上角显示关闭图标,并且可以通过close-icon属性自定义图标,使用close-icon-position属性可以自定义图标位置。

<van-popup\n  show="{{ show }}"\n  closeable\n  position="bottom"\n  custom-style="height: 20%"\n  bind:close="onClose"\n/>\n\n<!-- 自定义图标 -->\n<van-popup\n  show="{{ show }}"\n  closeable\n  close-icon="close"\n  position="bottom"\n  custom-style="height: 20%"\n  bind:close="onClose"\n/>\n\n<!-- 图标位置 -->\n<van-popup\n  show="{{ show }}"\n  closeable\n  close-icon-position="top-left"\n  position="bottom"\n  custom-style="height: 20%"\n  bind:close="onClose"\n/>\n

圆角弹窗

设置round属性后,弹窗会根据弹出位置添加不同的圆角样式。

<van-popup\n  show="{{ show }}"\n  round\n  position="bottom"\n  custom-style="height: 20%"\n  bind:close="onClose"\n/>\n

禁止滚动穿透

使用组件时,会发现内容部分滚动到底时,继续划动会导致底层页面的滚动,这就是滚动穿透。

目前,组件可以通过 lock-scroll 属性处理部分滚动穿透问题。 但由于小程序自身原因,弹窗内容区域仍会出现滚动穿透。 不过,我们为开发者提供了一个推荐方案以完整解决滚动穿透:

page-meta

当小程序基础库最低版本在 2.9.0 以上时,即可使用 page-meta 组件动态修改页面样式

<!-- page-meta 只能是页面内的第一个节点 -->\n<page-meta page-style="{{ show ? 'overflow: hidden;' : '' }}" />\n\n<van-popup show="{{ show }}" catch:touchstart />\n

API

Props

参数说明类型默认值
show是否显示弹出层booleanfalse
z-indexz-index 层级number100
overlay是否显示遮罩层booleantrue
position弹出位置,可选值为 top bottom right leftstringcenter
duration动画时长,单位为毫秒number | object300
round是否显示圆角booleanfalse
custom-style自定义弹出层样式string''
overlay-style自定义遮罩层样式string''
close-on-click-overlay是否在点击遮罩层后关闭booleantrue
closeable是否显示关闭图标booleanfalse
close-icon关闭图标名称或图片链接stringcross
safe-area-inset-bottom是否为 iPhoneX 留出底部安全距离booleantrue
safe-area-inset-top是否留出顶部安全距离(状态栏高度)booleanfalse
lock-scroll v1.7.3是否锁定背景滚动booleantrue

Events

事件名说明参数
bind:close关闭弹出层时触发-
bind:click-overlay点击遮罩层时触发-
bind:before-enter进入前触发-
bind:enter进入中触发-
bind:after-enter进入后触发-
bind:before-leave离开前触发-
bind:leave离开中触发-
bind:after-leave离开后触发-

外部样式类

类名说明
custom-class根节点样式类
',13)],ki={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",wi,_i)))},Si={class:"van-doc-markdown-body"},Ci=[wn('

Progress 进度条

介绍

用于展示操作的当前进度。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-progress": "@vant/weapp/progress/index"\n}\n

代码演示

基础用法

进度条默认为蓝色,使用percentage属性来设置当前进度。

<van-progress percentage="50" />\n

线条粗细

通过stroke-width可以设置进度条的粗细。

<van-progress :percentage="50" stroke-width="8" />\n

置灰

设置inactive属性后进度条将置灰。

<van-progress inactive percentage="50" />\n

样式定制

可以使用pivot-text属性自定义文字,color属性自定义进度条颜色。

<van-progress pivot-text="橙色" color="#f2826a" percentage="25" />\n\n<van-progress pivot-text="红色" color="#ee0a24" percentage="50" />\n\n<van-progress\n  percentage="75"\n  pivot-text="紫色"\n  pivot-color="#7232dd"\n  color="linear-gradient(to right, #be99ff, #7232dd)"\n/>\n

API

Props

参数说明类型默认值
inactive是否置灰booleanfalse
percentage进度百分比number0
stroke-width进度条粗细,默认单位为pxstring | number4px
show-pivot是否显示进度文字booleantrue
color进度条颜色string#1989fa
text-color进度文字颜色string#fff
track-color轨道颜色string#e5e5e5
pivot-text文字显示string百分比文字
pivot-color文字背景色string与进度条颜色一致

外部样式类

类名说明
custom-class根节点样式类
',11)],zi={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Si,Ci)))},Pi={class:"van-doc-markdown-body"},Ii=[wn('

Radio 单选框

介绍

在一组备选项中进行单选。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-radio": "@vant/weapp/radio/index",\n  "van-radio-group": "@vant/weapp/radio-group/index"\n}\n

代码演示

基础用法

通过value绑定值当前选中项的 name 。

<van-radio-group value="{{ radio }}" bind:change="onChange">\n  <van-radio name="1">单选框 1</van-radio>\n  <van-radio name="2">单选框 2</van-radio>\n</van-radio-group>\n
Page({\n  data: {\n    radio: '1',\n  },\n\n  onChange(event) {\n    this.setData({\n      radio: event.detail,\n    });\n  },\n});\n

水平排列

direction属性设置为horizontal后,单选框组会变成水平排列。

<van-radio-group\n  value="{{ radio }}"\n  bind:change="onChange"\n  direction="horizontal"\n>\n  <van-radio name="1">单选框 1</van-radio>\n  <van-radio name="2">单选框 2</van-radio>\n</van-radio-group>\n

禁用状态

通过disabled属性禁止选项切换,在Radio上设置diabled可以禁用单个选项。

<van-radio-group value="{{ radio }}" disabled bind:change="onChange">\n  <van-radio name="1">单选框 1</van-radio>\n  <van-radio name="2">单选框 2</van-radio>\n</van-radio-group>\n

自定义形状

shape属性设置为square,单选框的形状会变成方形。

<van-radio-group value="{{ radio }}" bind:change="onChange">\n  <van-radio name="1" shape="square">单选框 1</van-radio>\n  <van-radio name="2" shape="square">单选框 2</van-radio>\n</van-radio-group>\n

自定义颜色

通过checked-color属性设置选中状态的图标颜色。

<van-radio-group value="{{ radio }}" bind:change="onChange">\n  <van-radio name="1" checked-color="#07c160">单选框 1</van-radio>\n  <van-radio name="2" checked-color="#07c160">单选框 2</van-radio>\n</van-radio-group>\n

自定义大小

通过icon-size属性可以自定义图标的大小。

<van-radio-group value="{{ radio }}" bind:change="onChange">\n  <van-radio name="1" icon-size="24px">单选框 1</van-radio>\n  <van-radio name="2" icon-size="24px">单选框 2</van-radio>\n</van-radio-group>\n

自定义图标

通过icon插槽自定义图标,需要设置use-icon-slot属性。

<van-radio-group value="{{ radio }}" bind:change="onChange">\n  <van-radio use-icon-slot value="{{ radio }}" name="1">\n    自定义图标\n    <image slot="icon" src="{{ radio === '1' ? icon.active : icon.normal }}" />\n  </van-radio>\n  <van-radio use-icon-slot value="{{ radio }}" name="2">\n    自定义图标\n    <image slot="icon" src="{{ radio === '2' ? icon.active : icon.normal }}" />\n  </van-radio>\n</van-radio-group>\n
Page({\n  data: {\n    radio: true,\n    icon: {\n      normal: '//img.yzcdn.cn/icon-normal.png',\n      active: '//img.yzcdn.cn/icon-active.png',\n    },\n  },\n  onChange(event) {\n    this.setData({\n      radio: event.detail,\n    });\n  },\n});\n

禁用文本点击

通过设置label-disabled属性可以禁用单选框文本点击。

<van-radio-group value="{{ radio }}" bind:change="onChange">\n  <van-radio name="1" label-disabled>单选框 1</van-radio>\n  <van-radio name="2" label-disabled>单选框 2</van-radio>\n</van-radio-group>\n

与 Cell 组件一起使用

此时你需要再引入CellCellGroup组件。

<van-radio-group value="{{ radio }}" bind:change="onChange">\n  <van-cell-group>\n    <van-cell title="单选框 1" clickable data-name="1" bind:click="onClick">\n      <van-radio slot="right-icon" name="1" />\n    </van-cell>\n    <van-cell title="单选框 2" clickable data-name="2" bind:click="onClick">\n      <van-radio slot="right-icon" name="2" />\n    </van-cell>\n  </van-cell-group>\n</van-radio-group>\n
Page({\n  data: {\n    radio: '1',\n  },\n\n  onChange(event) {\n    this.setData({\n      radio: event.detail,\n    });\n  },\n\n  onClick(event) {\n    const { name } = event.currentTarget.dataset;\n    this.setData({\n      radio: name,\n    });\n  },\n});\n

API

RadioGroup Props

参数说明类型默认值
name在表单内提交时的标识符string-
value当前选中项的标识符any-
disabled是否禁用所有单选框booleanfalse
direction v1.6.7排列方向,可选值为 horizontalstringvertical

Radio Props

参数说明类型默认值
name标识符string-
shape形状,可选值为 squarestringround
disabled是否为禁用状态booleanfalse
label-disabled是否禁用文本内容点击booleanfalse
label-position文本位置,可选值为 leftstringright
icon-size图标大小,默认单位为pxstring | number20px
checked-color选中状态颜色string#1989fa
use-icon-slot是否使用 icon 插槽booleanfalse

Radio Event

事件名说明回调参数
bind:change当绑定值变化时触发的事件当前选中项的 name

Radio 外部样式类

类名说明
custom-class根节点样式类
icon-class图标样式类
label-class描述信息样式类

RadioGroup Event

事件名说明回调参数
bind:change当绑定值变化时触发的事件当前选中项的 name
',19)],Oi={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Pi,Ii)))},Ei={class:"van-doc-markdown-body"},Di=[wn('

Rate 评分

介绍

用于对事物进行评级操作。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-rate": "@vant/weapp/rate/index"\n}\n

代码演示

基础用法

<van-rate value="{{ value }}" bind:change="onChange" />\n
Page({\n  data: {\n    value: 3,\n  },\n\n  onChange(event) {\n    this.setData({\n      value: event.detail,\n    });\n  },\n});\n

自定义图标

<van-rate\n  value="{{ value }}"\n  icon="like"\n  void-icon="like-o"\n  bind:change="onChange"\n/>\n

自定义样式

<van-rate\n  value="{{ value }}"\n  size="{{ 25 }}"\n  color="#ffd21e"\n  void-icon="star"\n  void-color="#eee"\n  bind:change="onChange"\n/>\n

半星

<van-rate\n  value="{{ value }}"\n  allow-half\n  void-icon="star"\n  void-color="#eee"\n  bind:change="onChange"\n/>\n
Page({\n  data: {\n    value: 2.5,\n  },\n\n  onChange(event) {\n    this.setData({\n      value: event.detail,\n    });\n  },\n});\n

自定义数量

<van-rate value="{{ value }}" count="{{ 6 }}" bind:change="onChange" />\n

禁用状态

<van-rate disabled value="{{ value }}" bind:change="onChange" />\n

只读状态

<van-rate readonly value="{{ value }}" bind:change="onChange" />\n

监听 change 事件

评分变化时,会触发 change 事件。

<van-rate value="{{ value }}" bind:change="onChange" />\n
Page({\n  data: {\n    value: 2,\n  },\n\n  onChange(event) {\n    Toast('当前值:' + event.detail);\n  },\n});\n

API

Props

参数说明类型默认值
name在表单内提交时的标识符string-
value当前分值number-
count图标总数number5
size图标大小,默认单位为 pxstring | number20px
gutter图标间距,默认单位为 pxstring | number4px
color选中时的颜色string#ffd21e
void-color未选中时的颜色string#c7c7c7
icon选中时的图标名称或图片链接,可选值见 Icon 组件stringstar
void-icon未选中时的图标名称或图片链接,可选值见 Icon 组件stringstar-o
allow-half是否允许半选booleanfalse
readonly是否为只读状态 \bbooleanfalse
disabled是否禁用评分booleanfalse
disabled-color禁用时的颜色string#bdbdbd
touchable是否可以通过滑动手势选择评分booleantrue

Events

事件名称说明回调参数
change当前分值变化时触发的事件event.detail:当前分值

外部样式类

类名说明
custom-class根节点样式类
icon-class图标样式类
',16)],Ti={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Ei,Di)))},Ai={class:"van-doc-markdown-body"},Ni=[wn('

Search 搜索

介绍

用于搜索场景的输入框组件。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-search": "@vant/weapp/search/index"\n}\n

代码演示

基础用法

van-search 中,value 用于控制搜索框中的文字。background 可以自定义搜索框外部背景色。

<van-search value="{{ value }}" placeholder="请输入搜索关键词" />\n

事件监听

van-search 提供了 search 和 cancel 事件。search 事件在用户点击键盘上的搜索按钮触发。cancel 事件在用户点击搜索框右侧取消按钮时触发。

<van-search\n  value="{{ value }}"\n  placeholder="请输入搜索关键词"\n  show-action\n  bind:search="onSearch"\n  bind:cancel="onCancel"\n/>\n

搜索框内容对齐

通过 input-align 属性可以设置搜索框内容的对齐方式。

<van-search\n  value="{{ value }}"\n  input-align="center"\n  placeholder="请输入搜索关键词"\n/>\n

禁用搜索框

通过 disabled 属性可以将组件设置为禁用状态。

<van-search disabled value="{{ value }}" placeholder="请输入搜索关键词" />\n

自定义背景色

通过background属性可以设置搜索框外部的背景色,通过shape属性设置搜索框的形状,可选值为round

<van-search\n  value="{{ value }}"\n  shape="round"\n  background="#4fc08d"\n  placeholder="请输入搜索关键词"\n/>\n

自定义按钮

van-search 支持自定义右侧取消按钮,使用名字为 action 的 slot,并设置 use-action-slot 为 true 即可。

<van-search\n  value="{{ value }}"\n  label="地址"\n  placeholder="请输入搜索关键词"\n  use-action-slot\n  bind:change="onChange"\n  bind:search="onSearch"\n>\n  <view slot="action" bind:tap="onClick">搜索</view>\n</van-search>\n
Page({\n  data: {\n    value: '',\n  },\n  onChange(e) {\n    this.setData({\n      value: e.detail,\n    });\n  },\n  onSearch() {\n    Toast('搜索' + this.data.value);\n  },\n  onClick() {\n    Toast('搜索' + this.data.value);\n  },\n});\n

API

Props

参数说明类型默认值
name在表单内提交时的标识符string-
label搜索框左侧文本string-
shape形状,可选值为 roundstringsquare
value当前输入的值string | number-
background搜索框背景色string#f2f2f2
show-action是否在搜索框右侧显示取消按钮booleanfalse
action-text v1.0.0取消按钮文字string取消
focus获取焦点booleanfalse
error是否将输入内容标红booleanfalse
disabled是否禁用输入框booleanfalse
readonly是否只读booleanfalse
clearable是否启用清除控件booleantrue
clear-trigger v1.8.4显示清除图标的时机,always 表示输入框不为空时展示,
focus 表示输入框聚焦且不为空时展示
stringfocus
clear-icon v1.8.4清除图标名称或图片链接stringclear
maxlength最大输入长度,设置为 -1 的时候不限制最大长度number-1
use-action-slot是否使用 action slotbooleanfalse
placeholder输入框为空时占位符string-
placeholder-style指定占位符的样式string-
input-align输入框内容对齐方式,可选值为 center rightstringleft
use-left-icon-slot是否使用输入框左侧图标 slotbooleanfalse
use-right-icon-slot是否使用输入框右侧图标 slotbooleanfalse
left-icon输入框左侧图标名称或图片链接,可选值见 Icon 组件(如果设置了 use-left-icon-slot,则该属性无效)stringsearch
right-icon输入框右侧图标名称或图片链接,可选值见 Icon 组件(如果设置了 use-right-icon-slot,则该属性无效)string-

Events

事件名说明参数
bind:search确定搜索时触发event.detail: 当前输入值
bind:change输入内容变化时触发event.detail: 当前输入值
bind:cancel取消搜索搜索时触发-
bind:focus输入框聚焦时触发-
bind:blur输入框失焦时触发-
bind:clear点击清空控件时触发-
bind:click-input点击搜索区域时触发-

Slot

名称说明
action自定义搜索框右侧按钮,需要在use-action-slot为 true 时才会显示
label自定义搜索框左侧文本
left-icon自定义输入框左侧图标,需要在use-left-icon-slot为 true 时才会显示
right-icon自定义输入框右侧图标,需要在use-right-icon-slot为 true 时才会显示

外部样式类

类名说明
custom-class根节点样式类
field-class搜索框样式类
input-class输入框样式类
cancel-class取消按钮样式类
',15)],Fi={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Ai,Ni)))},Li={class:"van-doc-markdown-body"},Ri=[wn('

ShareSheet 分享面板

介绍

底部弹起的分享面板,用于展示各分享渠道对应的操作按钮,不含具体的分享逻辑。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-share-sheet": "@vant/weapp/share-sheet/index"\n}\n

代码演示

基础用法

分享面板通过 options 属性来定义分享选项,数组的每一项是一个对象,对象格式见文档下方表格。

<van-cell title="显示分享面板" bind:click="onClick" />\n<van-share-sheet\n  show="{{ showShare }}"\n  title="立即分享给好友"\n  options="{{ options }}"\n  bind:select="onSelect"\n  bind:close="onClose"\n/>\n
Page({\n  data: {\n    showShare: false,\n    options: [\n      { name: '微信', icon: 'wechat', openType: 'share' },\n      { name: '微博', icon: 'weibo' },\n      { name: '复制链接', icon: 'link' },\n      { name: '分享海报', icon: 'poster' },\n      { name: '二维码', icon: 'qrcode' },\n    ],\n  },\n\n  onClick(event) {\n    this.setData({ showShare: true });\n  },\n\n  onClose() {\n    this.setData({ showShare: false });\n  },\n\n  onSelect(event) {\n    Toast(event.detail.name);\n    this.onClose();\n  },\n});\n

展示多行选项

当分享选项的数量较多时,可以将 options 定义为数组嵌套的格式,每个子数组会作为一行选项展示。

<van-share-sheet\n  show="{{ showShare }}"\n  title="立即分享给好友"\n  options="{{ options }}"\n/>\n
Page({\n  data: {\n    showShare: false,\n    options: [\n      [\n        { name: '微信', icon: 'wechat' },\n        { name: '微博', icon: 'weibo' },\n        { name: 'QQ', icon: 'qq' },\n      ],\n      [\n        { name: '复制链接', icon: 'link' },\n        { name: '分享海报', icon: 'poster' },\n        { name: '二维码', icon: 'qrcode' },\n      ],\n    ],\n  },\n});\n

自定义图标

除了使用内置的几种图标外,可以直接在 icon 中传入图片 URL 来使用自定义的图标。

<van-share-sheet show="{{ showShare }}" options="{{ options }}" />\n
Page({\n  data: {\n    showShare: false,\n    options: [\n      {\n        name: '名称',\n        icon: 'https://img.yzcdn.cn/vant/custom-icon-fire.png',\n      },\n      {\n        name: '名称',\n        icon: 'https://img.yzcdn.cn/vant/custom-icon-light.png',\n      },\n      {\n        name: '名称',\n        icon: 'https://img.yzcdn.cn/vant/custom-icon-water.png',\n      },\n    ],\n  },\n});\n

展示描述信息

通过 description 属性可以设置标题下方的描述文字, 在 options 内设置 description 属性可以添加分享选项描述。

<van-share-sheet\n  show="{{ showShare }}"\n  options="{{ options }}"\n  title="立即分享给好友"\n  description="描述信息"\n/>\n
Page({\n  data: {\n    showShare: false,\n    options: [\n      { name: '微信', icon: 'wechat' },\n      { name: '微博', icon: 'weibo' },\n      {\n        name: '复制链接',\n        icon: 'link',\n        description: '描述信息',\n      },\n      { name: '分享海报', icon: 'poster' },\n      { name: '二维码', icon: 'qrcode' },\n    ],\n  },\n});\n

API

Props

参数说明类型默认值
options分享选项Option[][]
title顶部标题string-
cancel-text取消按钮文字string'取消'
description标题下方的辅助描述文字string-
duration动画时长,单位毫秒number | string300
overlay是否显示遮罩层booleantrue
close-on-click-overlay是否在点击遮罩层后关闭booleantrue
safe-area-inset-bottom是否开启底部安全区适配booleantrue

Option 数据结构

options属性为一个对象数组,数组中的每个对象配置一列,对象可以包含以下值:

键名说明类型
name分享渠道名称string
description分享选项描述string
icon图标,可选值为 qq link weibo wechat poster qrcode weapp-qrcode wechat-moments,支持传入图片 URLstring
openType按钮 open-type,可用于实现分享功能,可选值为 sharestring

Events

事件名说明回调参数
select点击分享选项时触发option: Option, index: number
close关闭时触发-
cancel点击取消按钮时触发-
click-overlay点击遮罩层时触发-

Slots

名称说明
title自定义顶部标题
description自定义描述文字
',13)],Bi={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Li,Ri)))},Mi={class:"van-doc-markdown-body"},$i=[wn('

Sidebar 侧边导航

介绍

垂直展示的导航栏,用于在不同的内容区域之间进行切换。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-sidebar": "@vant/weapp/sidebar/index",\n  "van-sidebar-item": "@vant/weapp/sidebar-item/index"\n}\n

Vant Weapp 1.0 版本开始支持此组件,升级方式参见快速上手

代码演示

基础用法

通过在van-sidebar上设置activeKey属性来控制选中项。

<van-sidebar active-key="{{ activeKey }}">\n  <van-sidebar-item title="标签名" />\n  <van-sidebar-item title="标签名" />\n  <van-sidebar-item title="标签名" />\n</van-sidebar>\n
Page({\n  data: {\n    activeKey: 0,\n  },\n});\n

徽标提示

设置dot属性后,会在右上角展示一个小红点。设置badge属性后,会在右上角展示相应的徽标。

<van-sidebar active-key="{{ activeKey }}">\n  <van-sidebar-item title="标签名" dot />\n  <van-sidebar-item title="标签名" badge="5" />\n  <van-sidebar-item title="标签名" badge="99+" />\n</van-sidebar>\n

禁用选项

通过disabled属性禁用选项。

<van-sidebar active-key="{{ activeKey }}">\n  <van-sidebar-item title="标签名" />\n  <van-sidebar-item title="标签名" disabled />\n  <van-sidebar-item title="标签名" />\n</van-sidebar>\n

监听切换事件

设置change方法来监听切换导航项时的事件。

<van-sidebar active-key="{{ activeKey }}" bind:change="onChange">\n  <van-sidebar-item title="标签名 1" />\n  <van-sidebar-item title="标签名 2" />\n  <van-sidebar-item title="标签名 3" />\n</van-sidebar>\n\n<van-notify id="van-notify" />\n
import Notify from '@vant/weapp/dist/notify/notify';\n\nPage({\n  data: {\n    activeKey: 0,\n  },\n\n  onChange(event) {\n    Notify({ type: 'primary', message: event.detail });\n  },\n});\n

API

参数说明类型默认值
activeKey选中项的索引string | number0
事件名说明参数
change切换徽章时触发当前选中徽章的索引
类名说明
custom-class根节点样式类

SidebarItem Props

参数说明类型默认值
title内容string''
dot是否显示右上角小红点booleanfalse
info图标右上角徽标的内容(已废弃,请使用 badge 属性)string | number''
badge v1.5.0图标右上角徽标的内容string | number''
disabled是否禁用该项booleanfalse

SidebarItem Slot

名称说明
title自定义标题栏,如果设置了title属性则不生效

SidebarItem Event

事件名说明参数
click点击徽章时触发event.detail 为当前徽章的索引

SidebarItem 外部样式类

类名说明
custom-class根节点样式类
',16)],Ui={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Mi,$i)))},Vi={class:"van-doc-markdown-body"},Hi=[wn('

Skeleton 骨架屏

介绍

用于在内容加载过程中展示一组占位图形。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-skeleton": "@vant/weapp/skeleton/index"\n}\n

Vant Weapp 1.0 版本开始支持此组件,升级方式参见快速上手

代码演示

基础用法

通过title属性显示标题占位图,通过row属性配置占位段落行数。

<van-skeleton title row="3" />\n

显示头像

通过avatar属性显示头像占位图。

<van-skeleton title avatar row="3" />\n

展示子组件

loading属性设置成false表示内容加载完成,此时会隐藏占位图,并显示Skeleton的子组件。

<van-skeleton title avatar row="3" loading="{{ loading }}">\n  <view>实际内容</view>\n</van-skeleton>\n
Page({\n  data: {\n    loading: true,\n  },\n  onReady() {\n    this.setData({\n      loading: false,\n    });\n  },\n});\n

API

Props

参数说明类型默认值
row段落占位图行数number0
row-width段落占位图宽度,可传数组来设置每一行的宽度string | string[]100%
title是否显示标题占位图booleanfalse
title-width标题占位图宽度string | number40%
avatar是否显示头像占位图booleanfalse
avatar-size头像占位图大小string | number32px
avatar-shape头像占位图形状,可选值为squarestringround
loading是否显示占位图,传false时会展示子组件内容booleantrue
animate是否开启动画booleantrue
',9)],Wi={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Vi,Hi)))},Gi={class:"van-doc-markdown-body"},Ki=[wn('

Slider 滑块

介绍

滑动输入条,用于在给定的范围内选择一个值。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-slider": "@vant/weapp/slider/index"\n}\n

代码演示

基本用法

<van-slider value="50" bind:change="onChange" />\n
Page({\n  onChange(event) {\n    wx.showToast({\n      icon: 'none',\n      title: `当前值:${event.detail}`,\n    });\n  },\n});\n

双滑块

添加 range 属性就可以开启双滑块模式,确保 value 的值是一个数组。

<van-slider value="{{ 10, 50 }}" range @change="onChange" />\n
Page({\n  onChange(event) {\n    wx.showToast({\n      icon: 'none',\n      title: `当前值:${event.detail}`,\n    });\n  },\n});\n

指定选择范围

<van-slider min="-50" max="50" />\n

禁用

<van-slider value="50" disabled />\n

指定步长

<van-slider value="50" step="10" />\n

自定义样式

<van-slider value="50" bar-height="4px" active-color="#ee0a24" />\n

自定义按钮

<van-slider value="{{ currentValue }}" use-button-slot bind:drag="onDrag">\n  <view class="custom-button" slot="button">{{ currentValue }}/100</view>\n</van-slider>\n
Page({\n  data: {\n    currentValue: 50,\n  },\n\n  onDrag(event) {\n    this.setData({\n      currentValue: event.detail.value,\n    });\n  },\n});\n

垂直方向

设置 vertical 属性后,滑块会垂直展示,且高度为 100% 父元素高度。

<view style="height: 150px;">\n  <van-slider value="50" vertical bind:change="onChange" />\n  <van-slider\n    value="{{ [10, 50] }}"\n    range\n    vertical\n    style="margin-left: 100px;"\n    bind:change="onChange"\n  />\n</view>\n
Page({\n  onChange(event) {\n    wx.showToast({\n      icon: 'none',\n      title: `当前值:${event.detail}`,\n    });\n  },\n});\n

API

Props

参数说明类型默认值
value当前进度百分比,在双滑块模式下为数组格式number | number[]0
disabled是否禁用滑块booleanfalse
max最大值number100
min最小值number0
step步长number1
bar-height进度条高度,默认单位为 pxstring | number2px
active-color进度条激活态颜色string#1989fa
inactive-color进度条默认颜色string#e5e5e5
use-slot-button是否使用按钮插槽booleanfalse
range v1.8.4是否开启双滑块模式booleanfalse
vertical v1.8.5是否垂直展示booleanfalse

Events

事件名说明参数
bind:drag拖动进度条时触发event.detail.value: 当前进度
bind:change进度值改变后触发event.detail: 当前进度
bind:drag-start开始拖动时触发-
bind:drag-end结束拖动时触发-

外部样式类

类名说明
custom-class根节点样式类

Slots

名称说明参数
button自定义滑块按钮{ value: number }
left-button v1.8.4自定义左侧滑块按钮(双滑块模式下){ value: number }
right-button v1.8.4自定义右侧滑块按钮 (双滑块模式下){ value: number }
',17)],Qi={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Gi,Ki)))},Yi={class:"van-doc-markdown-body"},Xi=[wn('

Stepper 步进器

介绍

步进器由增加按钮、减少按钮和输入框组成,用于在一定范围内输入、调整数字。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-stepper": "@vant/weapp/stepper/index"\n}\n

代码演示

基础用法

通过value设置输入值,可以通过change事件监听到输入值的变化。

<van-stepper value="{{ 1 }}" bind:change="onChange" />\n
Page({\n  onChange(event) {\n    console.log(event.detail);\n  },\n});\n

步长设置

通过step属性设置每次点击增加或减少按钮时变化的值,默认为1

<van-stepper value="{{ 1 }}" step="2" />\n

限制输入范围

通过minmax属性限制输入值的范围。

<van-stepper value="{{ 5 }}" min="5" max="8" />\n

限制输入整数

设置integer属性后,输入框将限制只能输入整数。

<van-stepper value="{{ 1 }}" integer />\n

禁用状态

通过设置disabled属性来禁用步进器,禁用状态下无法点击按钮或修改输入框。

<van-stepper value="{{ 1 }}" disabled />\n

关闭长按

通过设置long-press属性决定步进器是否开启长按手势。

<van-stepper value="{{ 1 }}" long-press="{{ false }}" />\n

固定小数位数

通过设置decimal-length属性可以保留固定的小数位数。

<van-stepper value="{{ 1 }}" step="0.2" decimal-length="{{ 1 }}" />\n

异步变更

如果需要异步地修改输入框的值,可以设置async-change属性,并在change事件中手动修改value

<van-stepper value="{{ value }}" async-change bind:change="onChange" />\n
Page({\n  data: {\n    value: 1,\n  },\n\n  onChange(value) {\n    Toast.loading({ forbidClick: true });\n\n    setTimeout(() => {\n      Toast.clear();\n      this.setData({ value });\n    }, 500);\n  },\n});\n

自定义大小

通过input-width属性设置输入框宽度,通过button-size属性设置按钮大小和输入框高度。

<van-stepper value="{{ 1 }}" input-width="40px" button-size="32px" />\n

API

Props

参数说明类型默认值
name在表单内提交时的标识符string-
value输入值string | number最小值
min最小值string | number1
max最大值string | number-
step步长string | number1
integer是否只允许输入整数booleanfalse
disabled是否禁用booleanfalse
disable-input是否禁用输入框booleanfalse
async-change是否开启异步变更,开启后需要手动控制输入值booleanfalse
input-width输入框宽度,默认单位为 pxstring | number32px
button-size按钮大小,默认单位为 px,输入框高度会和按钮大小保持一致string | number28px
show-plus是否显示增加按钮booleantrue
show-minus是否显示减少按钮booleantrue
decimal-length固定显示的小数位数number-
theme样式风格,可选值为 roundstring-
disable-plus是否禁用增加按钮boolean-
disable-minus是否禁用减少按钮boolean-
long-press是否开启长按手势booleantrue

Events

事件名说明回调参数
bind:change当绑定值变化时触发的事件event.detail: 当前输入的值
bind:overlimit点击不可用的按钮时触发-
bind:plus点击增加按钮时触发-
bind:minus点击减少按钮时触发-
bind:focus输入框聚焦时触发-
bind:blur输入框失焦时触发-

Slot

名称说明
plus加号按钮
minus减号按钮

外部样式类

类名说明
custom-class根节点样式类
input-class输入框样式类
plus-class加号按钮样式类
minus-class减号按钮样式类
',18)],Ji={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Yi,Xi)))},Zi={class:"van-doc-markdown-body"},sh=[wn('

Steps 步骤条

介绍

用于展示操作流程的各个环节,让用户了解当前的操作在整体流程中的位置。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-steps": "@vant/weapp/steps/index"\n}\n

代码演示

基础用法

<van-steps steps="{{ steps }}" active="{{ active }}" />\n
Page({\n  data: {\n    steps: [\n      {\n        text: '步骤一',\n        desc: '描述信息',\n      },\n      {\n        text: '步骤二',\n        desc: '描述信息',\n      },\n      {\n        text: '步骤三',\n        desc: '描述信息',\n      },\n      {\n        text: '步骤四',\n        desc: '描述信息',\n      },\n    ],\n  },\n});\n

自定义样式

可以通过 active-iconactive-color 属性设置激活状态下的图标和颜色。

<van-steps\n  steps="{{ steps }}"\n  active="{{ active }}"\n  active-icon="success"\n  active-color="#38f"\n/>\n

自定义图标

可以通过 inactiveIconactiveIcon 属性分别设置每一项的图标。

<van-steps steps="{{ steps }}" active="{{ active }}" />\n
Page({\n  data: {\n    steps: [\n      {\n        text: '步骤一',\n        desc: '描述信息',\n        inactiveIcon: 'location-o',\n        activeIcon: 'success',\n      },\n      {\n        text: '步骤二',\n        desc: '描述信息',\n        inactiveIcon: 'like-o',\n        activeIcon: 'plus',\n      },\n      {\n        text: '步骤三',\n        desc: '描述信息',\n        inactiveIcon: 'star-o',\n        activeIcon: 'cross',\n      },\n      {\n        text: '步骤四',\n        desc: '描述信息',\n        inactiveIcon: 'phone-o',\n        activeIcon: 'fail',\n      },\n    ],\n  },\n});\n

竖向步骤条

可以通过设置direction属性来改变步骤条的显示方式。

<van-steps\n  steps="{{ steps }}"\n  active="{{ active }}"\n  direction="vertical"\n  active-color="#ee0a24"\n/>\n

API

Steps Props

参数说明类型默认值
active当前步骤number0
direction显示方向,可选值为 horizontal verticalstringhorizontal
active-color激活状态颜色string#07c160
inactive-color未激活状态颜色string#969799
active-icon激活状态底部图标,可选值见 Icon 组件stringchecked
inactive-icon未激活状态底部图标,可选值见 Icon 组件string-

Events

事件名称说明回调参数
bind:click-step点击步骤时触发的事件event.detail:当前步骤的索引

外部样式类

类名说明
custom-class根节点样式类
desc-class描述信息样式类
',12)],ah={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Zi,sh)))},th={class:"van-doc-markdown-body"},nh=[wn('

Sticky 粘性布局

介绍

Sticky 组件与 CSS 中position: sticky属性实现的效果一致,当组件在屏幕范围内时,会按照正常的布局排列,当组件滚出屏幕范围时,始终会固定在屏幕顶部。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-sticky": "@vant/weapp/sticky/index"\n}\n

Vant Weapp 1.0 版本开始支持此组件,升级方式参见快速上手

代码演示

基础用法

将内容包裹在Sticky组件内即可。

<van-sticky>\n  <van-button type="primary">基础用法</van-button>\n</van-sticky>\n

吸顶距离

通过offset-top属性可以设置组件在吸顶时与顶部的距离。

<van-sticky offset-top="{{ 50 }}">\n  <van-button type="info">吸顶距离</van-button>\n</van-sticky>\n

指定容器

通过container属性可以指定组件的容器,页面滚动时,组件会始终保持在容器范围内,当组件即将超出容器底部时,会返回原位置。

<view id="container" style="height: 150px;">\n  <van-sticky container="{{ container }}">\n    <van-button type="warning">指定容器</van-button>\n  </van-sticky>\n</view>\n
Page({\n  data: {\n    container: null,\n  },\n\n  onReady() {\n    this.setData({\n      container: () => wx.createSelectorQuery().select('#container'),\n    });\n  },\n});\n

嵌套在 scroll-view 内使用

通过 scroll-topoffset-top 属性可以实现在 scroll-view 内嵌套使用。

<scroll-view\n  bind:scroll="onScroll"\n  scroll-y\n  id="scroller"\n  style="height: 200px;"\n>\n  <view style="height: 400px; padding-top: 50px;">\n    <van-sticky scroll-top="{{ scrollTop }}" offset-top="{{ offsetTop }}">\n      <van-button type="warning">嵌套在 scroll-view 内</van-button>\n    </van-sticky>\n  </view>\n</scroll-view>\n
Page({\n  data: {\n    scrollTop: 0,\n    offsetTop: 0,\n  },\n\n  onScroll(event) {\n    wx.createSelectorQuery()\n      .select('#scroller')\n      .boundingClientRect((res) => {\n        this.setData({\n          scrollTop: event.detail.scrollTop,\n          offsetTop: res.top,\n        });\n      })\n      .exec();\n  },\n});\n

API

Props

参数说明类型默认值
offset-top吸顶时与顶部的距离,单位pxnumber0
z-index吸顶时的 z-indexnumber99
container一个函数,返回容器对应的 NodesRef 节点function-
scroll-top当前滚动区域的滚动位置,非 null 时会禁用页面滚动事件的监听number-

Events

事件名说明回调参数
scroll滚动时触发{ scrollTop: 距离顶部位置, isFixed: 是否吸顶 }
',11)],eh={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",th,nh)))},lh={class:"van-doc-markdown-body"},ph=[wn('

SubmitBar 提交订单栏

介绍

用于展示订单金额与提交订单。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-submit-bar": "@vant/weapp/submit-bar/index"\n}\n

代码演示

基础用法

<van-submit-bar\n  price="{{ 3050 }}"\n  button-text="提交订单"\n  bind:submit="onSubmit"\n/>\n

禁用状态

禁用状态下不会触发submit事件。

<van-submit-bar\n  disabled\n  price="{{ 3050 }}"\n  button-text="提交订单"\n  tip="您的收货地址不支持同城送, 我们已为您推荐快递"\n  tip-icon="info-o"\n  bind:submit="onSubmit"\n/>\n

加载状态

加载状态下不会触发submit事件。

<van-submit-bar\n  loading\n  price="{{ 3050 }}"\n  button-text="提交订单"\n  bind:submit="onSubmit"\n/>\n

高级用法

通过插槽插入自定义内容。

<van-submit-bar\n  price="{{ 3050 }}"\n  button-text="提交订单"\n  bind:submit="onClickButton"\n  tip="{{ true }}"\n>\n  <van-tag type="primary">标签</van-tag>\n  <view slot="tip">您的收货地址不支持同城送, <text>修改地址</text></view>\n</van-submit-bar>\n

API

Props

参数说明类型默认值
price价格(单位分)number-
label价格文案string合计:
suffix-label价格右侧文案string-
button-text按钮文字string-
button-type按钮类型stringdanger
tip提示文案string | boolean-
tip-icon图标名称或图片链接,可选值见 Icon 组件string-
disabled是否禁用按钮booleanfalse
loading是否显示加载中的按钮booleanfalse
currency货币符号string¥
safe-area-inset-bottom是否为 iPhoneX 留出底部安全距离booleantrue
decimal-length价格小数点后位数number2

Events

事件名说明参数
submit按钮点击事件回调-

Slot

名称说明
-自定义订单栏左侧内容
top自定义订单栏上方内容
tip提示文案中的额外操作和说明

外部样式类

类名说明
custom-class根节点样式类
price-class价格样式类
button-class按钮样式类
bar-class订单栏样式类
',13)],ch={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",lh,ph)))},oh={class:"van-doc-markdown-body"},dh=[wn('

SwipeCell 滑动单元格

介绍

可以左右滑动来展示操作按钮的单元格组件。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-swipe-cell": "@vant/weapp/swipe-cell/index"\n}\n

代码演示

基础用法

<van-swipe-cell right-width="{{ 65 }}" left-width="{{ 65 }}">\n  <view slot="left">选择</view>\n  <van-cell-group>\n    <van-cell title="单元格" value="内容" />\n  </van-cell-group>\n  <view slot="right">删除</view>\n</van-swipe-cell>\n

异步关闭

当开启async-close时, 通过绑定close事件,可以自定义两侧滑动内容点击时的关闭行为。

<van-swipe-cell\n  id="swipe-cell"\n  right-width="{{ 65 }}"\n  left-width="{{ 65 }}"\n  async-close\n  bind:close="onClose"\n>\n  <view slot="left">选择</view>\n  <van-cell-group>\n    <van-cell title="单元格" value="内容" />\n  </van-cell-group>\n  <view slot="right">删除</view>\n</van-swipe-cell>\n
Page({\n  onClose(event) {\n    const { position, instance } = event.detail;\n    switch (position) {\n      case 'left':\n      case 'cell':\n        instance.close();\n        break;\n      case 'right':\n        Dialog.confirm({\n          message: '确定删除吗?',\n        }).then(() => {\n          instance.close();\n        });\n        break;\n    }\n  },\n});\n

主动打开

<van-swipe-cell\n  id="swipe-cell2"\n  right-width="{{ 65 }}"\n  left-width="{{ 65 }}"\n  name="示例"\n  bind:open="onOpen"\n>\n  <view slot="left" class="van-swipe-cell__left">选择</view>\n  <van-cell-group>\n    <van-cell title="单元格" value="内容" />\n  </van-cell-group>\n  <view slot="right" class="van-swipe-cell__right">删除</view>\n</van-swipe-cell>\n
Page({\n  onOpen(event) {\n    const { position, name } = event.detail;\n    switch (position) {\n      case 'left':\n        Notify({\n          type: 'primary',\n          message: `${name}${position}部分展示open事件被触发`,\n        });\n        break;\n      case 'right':\n        Notify({\n          type: 'primary',\n          message: `${name}${position}部分展示open事件被触发`,\n        });\n        break;\n    }\n  },\n});\n

API

Props

参数说明类型默认值
name标识符,可以在 close 事件的参数中获取到string | number-
left-width左侧滑动区域宽度number0
right-width右侧滑动区域宽度number0
async-close是否异步关闭booleanfalse
disabled v1.3.4是否禁用滑动booleanfalse

Slot

名称说明
-自定义显示内容
left左侧滑动内容
right右侧滑动内容

Events

事件名说明参数
click点击时触发关闭时的点击位置 (left right cell outside)
close关闭时触发{ position: ‘left’ | ‘right’ , instance , name: string }
open打开时触发{ position: ‘left’ | ‘right’ , name: string }

close 参数

参数类型说明
positionstring关闭时的点击位置 (left right cell outside)
instanceobjectSwipeCell 实例
name标识符string

方法

通过 selectComponent 可以获取到 SwipeCell 实例并调用实例方法

方法名参数返回值介绍
openposition: left | right-打开单元格侧边栏
close--收起单元格侧边栏
',13)],rh={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",oh,dh)))},ih={class:"van-doc-markdown-body"},hh=[wn('

Switch 开关

介绍

用于在打开和关闭状态之间进行切换。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-switch": "@vant/weapp/switch/index"\n}\n

代码演示

基础用法

<van-switch checked="{{ checked }}" bind:change="onChange" />\n
Page({\n  data: {\n    checked: true,\n  },\n\n  onChange({ detail }) {\n    // 需要手动对 checked 状态进行更新\n    this.setData({ checked: detail });\n  },\n});\n

禁用状态

<van-switch checked="{{ checked }}" disabled />\n

加载状态

<van-switch checked="{{ checked }}" loading />\n

自定义大小

<van-switch checked="{{ checked }}" size="24px" />\n

自定义颜色

<van-switch\n  checked="{{ checked }}"\n  active-color="#07c160"\n  inactive-color="#ee0a24"\n/>\n

异步控制

<van-switch checked="{{ checked }}" bind:change="onChange" />\n
Page({\n  data: {\n    checked: true,\n  },\n\n  onChange({ detail }) {\n    wx.showModal({\n      title: '提示',\n      content: '是否切换开关?',\n      success: (res) => {\n        if (res.confirm) {\n          this.setData({ checked2: detail });\n        }\n      },\n    });\n  },\n});\n

API

Props

参数说明类型默认值
name在表单内提交时的标识符string-
checked开关选中状态anyfalse
loading是否为加载状态booleanfalse
disabled是否为禁用状态booleanfalse
size开关尺寸string30px
active-color打开时的背景色string#1989fa
inactive-color关闭时的背景色string#fff
active-value打开时的值anytrue
inactive-value关闭时的值anyfalse

Events

事件名说明参数
bind:change开关状态切换回调event.detail: 是否选中开关

外部样式类

类名说明
custom-class根节点样式类
node-class圆点样式类
',14)],uh={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",ih,hh)))},gh={class:"van-doc-markdown-body"},jh=[wn('

Tab 标签页

介绍

选项卡组件,用于在不同的内容区域之间进行切换。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-tab": "@vant/weapp/tab/index",\n  "van-tabs": "@vant/weapp/tabs/index"\n}\n

代码演示

基础用法

通过active设定当前激活标签对应的索引值,默认情况下启用第一个标签。

<van-tabs active="{{ active }}" bind:change="onChange">\n  <van-tab title="标签 1">内容 1</van-tab>\n  <van-tab title="标签 2">内容 2</van-tab>\n  <van-tab title="标签 3">内容 3</van-tab>\n  <van-tab title="标签 4">内容 4</van-tab>\n</van-tabs>\n
Page({\n  data: {\n    active: 1,\n  },\n\n  onChange(event) {\n    wx.showToast({\n      title: `切换到标签 ${event.detail.name}`,\n      icon: 'none',\n    });\n  },\n});\n

通过名称匹配

在标签指定name属性的情况下,active的值为当前标签的name(此时无法通过索引值来匹配标签)。

<van-tabs active="a">\n  <van-tab title="标签 1" name="a">内容 1</van-tab>\n  <van-tab title="标签 2" name="b">内容 2</van-tab>\n  <van-tab title="标签 3" name="c">内容 3</van-tab>\n</van-tabs>\n

横向滚动

多于 5 个标签时,Tab 可以横向滚动。

<van-tabs active="{{ active }}">\n  <van-tab title="标签 1">内容 1</van-tab>\n  <van-tab title="标签 2">内容 2</van-tab>\n  <van-tab title="标签 3">内容 3</van-tab>\n  <van-tab title="标签 4">内容 4</van-tab>\n  <van-tab title="标签 5">内容 5</van-tab>\n  <van-tab title="标签 6">内容 6</van-tab>\n</van-tabs>\n

禁用标签

设置disabled属性即可禁用标签。如果需要监听禁用标签的点击事件,可以在van-tabs上监听disabled事件。

<van-tabs bind:disabled="onClickDisabled">\n  <van-tab title="标签 1">内容 1</van-tab>\n  <van-tab title="标签 2" disabled>内容 2</van-tab>\n  <van-tab title="标签 3">内容 3</van-tab>\n</van-tabs>\n
Page({\n  onClickDisabled(event) {\n    wx.showToast({\n      title: `标签 ${event.detail.name} 已被禁用`,\n      icon: 'none',\n    });\n  },\n});\n

样式风格

Tab支持两种样式风格:linecard,默认为line样式,可以通过type属性修改样式风格。

<van-tabs type="card">\n  <van-tab title="标签 1">内容 1</van-tab>\n  <van-tab title="标签 2">内容 2</van-tab>\n  <van-tab title="标签 3">内容 3</van-tab>\n</van-tabs>\n

点击事件

可以在van-tabs上绑定click事件,在回调参数的event.detail中可以取得被点击标签的标题和标识符。

<van-tabs bind:click="onClick">\n  <van-tab title="标签 1">内容 1</van-tab>\n  <van-tab title="标签 2">内容 2</van-tab>\n</van-tabs>\n
Page({\n  onClick(event) {\n    wx.showToast({\n      title: `点击标签 ${event.detail.name}`,\n      icon: 'none',\n    });\n  },\n});\n

粘性布局

通过sticky属性可以开启粘性布局,粘性布局下,当 Tab 滚动到顶部时会自动吸顶。

<van-tabs sticky>\n  <van-tab title="标签 1">内容 1</van-tab>\n  <van-tab title="标签 2">内容 2</van-tab>\n  <van-tab title="标签 3">内容 3</van-tab>\n  <van-tab title="标签 4">内容 4</van-tab>\n</van-tabs>\n

切换动画

可以通过animated来设置是否启用切换 tab 时的动画。

<van-tabs animated>\n  <van-tab title="标签 1">内容 1</van-tab>\n  <van-tab title="标签 2">内容 2</van-tab>\n  <van-tab title="标签 3">内容 3</van-tab>\n  <van-tab title="标签 4">内容 4</van-tab>\n</van-tabs>\n

滑动切换

通过swipeable属性可以开启滑动切换标签页。

<van-tabs swipeable>\n  <van-tab title="标签 1">内容 1</van-tab>\n  <van-tab title="标签 2">内容 2</van-tab>\n  <van-tab title="标签 3">内容 3</van-tab>\n  <van-tab title="标签 4">内容 4</van-tab>\n</van-tabs>\n

嵌套 popup

如果将 van-tabs 嵌套在 van-popup 等会隐藏内容的组件或节点内,当 van-tabs 显示时下划线将不会正常显示。

此时可以通过使用 wx:if 手动控制 van-tabs 的渲染来规避这种场景。

<van-popup show="{{ show }}">\n  <van-tabs wx:if="{{ show }}">\n    <van-tab title="标签 1">内容 1</van-tab>\n    <van-tab title="标签 2">内容 2</van-tab>\n    <van-tab title="标签 3">内容 3</van-tab>\n    <van-tab title="标签 4">内容 4</van-tab>\n  </van-tabs>\n</van-popup>\n

API

Tabs Props

参数说明类型默认值
type样式风格,可选值为cardstringline
color标签主题色string#ee0a24
active当前选中标签的标识符string | number0
duration动画时间,单位秒number0.3
line-width底部条宽度,默认单位pxstring | number40px
line-height底部条高度,默认单位pxstring | number3px
animated是否开启切换标签内容时的转场动画booleanfalse
border是否展示外边框,仅在 line 风格下生效booleanfalse
ellipsis是否省略过长的标题文字booleantrue
sticky是否使用粘性定位布局booleanfalse
swipeable是否开启手势滑动切换booleanfalse
lazy-render是否开启标签页内容延迟渲染booleantrue
offset-top粘性定位布局下与顶部的最小距离,单位pxnumber-
swipe-threshold滚动阈值,标签数量超过阈值且总宽度超过标签栏宽度时开始横向滚动number5
title-active-color标题选中态颜色string-
title-inactive-color标题默认态颜色string-
z-indexz-index 层级number1

Tab Props

参数说明类型默认值
name标签名称,作为匹配的标识符string | number标签的索引值
title标题string-
disabled是否禁用标签booleanfalse
dot是否显示小红点boolean-
info图标右上角提示信息string | number-
title-style自定义标题样式string-

Tabs Slot

名称说明
nav-left标题左侧内容
nav-right标题右侧内容

Tab Slot

名称说明
-标签页内容

Tabs Event

事件名说明参数
bind:click点击标签时触发name:标签标识符,title:标题
bind:change当前激活的标签改变时触发name:标签标识符,title:标题
bind:disabled点击被禁用的标签时触发name:标签标识符,title:标题
bind:scroll滚动时触发{ scrollTop: 距离顶部位置, isFixed: 是否吸顶 }

外部样式类

类名说明
custom-class根节点样式类
nav-class标签栏样式类
tab-class标签样式类
tab-active-class标签激活态样式类

方法

通过 selectComponent 可以获取到 Tabs 实例并调用实例方法。

方法名参数返回值介绍
resize--外层元素大小或组件显示状态变化时,可以调用此方法来触发重绘

常见问题

组件从隐藏状态切换到显示状态时,底部条位置错误?

Tabs 组件在挂载时,会获取自身的宽度,并计算出底部条的位置。如果组件一开始处于隐藏状态,则获取到的宽度永远为 0,因此无法展示底部条位置。

解决方法

方法一,使用 wx:if 来控制组件展示,使组件重新初始化。

<van-tabs wx:if="show" />\n

方法二,调用组件的 resize 方法来主动触发重绘。

<van-tabs id="tabs" />\n
this.selectComponent('#tabs').resize();\n
',24)],mh={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",gh,jh)))},vh={class:"van-doc-markdown-body"},bh=[wn('

Tabbar 标签栏

介绍

底部导航栏,用于在不同页面之间进行切换。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-tabbar": "@vant/weapp/tabbar/index",\n  "van-tabbar-item": "@vant/weapp/tabbar-item/index"\n}\n

代码演示

基础用法

<van-tabbar active="{{ active }}" bind:change="onChange">\n  <van-tabbar-item icon="home-o">标签</van-tabbar-item>\n  <van-tabbar-item icon="search">标签</van-tabbar-item>\n  <van-tabbar-item icon="friends-o">标签</van-tabbar-item>\n  <van-tabbar-item icon="setting-o">标签</van-tabbar-item>\n</van-tabbar>\n
Page({\n  data: {\n    active: 0,\n  },\n  onChange(event) {\n    // event.detail 的值为当前选中项的索引\n    this.setData({ active: event.detail });\n  },\n});\n

通过名称匹配

在标签指定name属性的情况下,v-model的值为当前标签的name

<van-tabbar active="{{ active }}" bind:change="onChange">\n  <van-tabbar-item name="home" icon="home-o">标签</van-tabbar-item>\n  <van-tabbar-item name="search" icon="search">标签</van-tabbar-item>\n  <van-tabbar-item name="friends" icon="friends-o">标签</van-tabbar-item>\n  <van-tabbar-item name="setting" icon="setting-o">标签</van-tabbar-item>\n</van-tabbar>\n
Page({\n  data: {\n    active: 'home',\n  },\n  onChange(event) {\n    this.setData({ active: event.detail });\n  },\n});\n

显示徽标

<van-tabbar active="{{ active }}" bind:change="onChange">\n  <van-tabbar-item icon="home-o">标签</van-tabbar-item>\n  <van-tabbar-item icon="search" dot>标签</van-tabbar-item>\n  <van-tabbar-item icon="friends-o" info="5">标签</van-tabbar-item>\n  <van-tabbar-item icon="setting-o" info="20">标签</van-tabbar-item>\n</van-tabbar>\n

自定义图标

可以通过 slot 自定义图标,其中 icon slot 代表未选中状态下的图标,icon-active slot 代表选中状态下的图标。

<van-tabbar active="{{ active }}" bind:change="onChange">\n  <van-tabbar-item info="3">\n    <image\n      slot="icon"\n      src="{{ icon.normal }}"\n      mode="aspectFit"\n      style="width: 30px; height: 18px;"\n    />\n    <image\n      slot="icon-active"\n      src="{{ icon.active }}"\n      mode="aspectFit"\n      style="width: 30px; height: 18px;"\n    />\n    自定义\n  </van-tabbar-item>\n  <van-tabbar-item icon="search">标签</van-tabbar-item>\n  <van-tabbar-item icon="setting-o">标签</van-tabbar-item>\n</van-tabbar>\n
Page({\n  data: {\n    active: 0,\n    icon: {\n      normal: 'https://img.yzcdn.cn/vant/user-inactive.png',\n      active: 'https://img.yzcdn.cn/vant/user-active.png',\n    },\n  },\n  onChange(event) {\n    this.setData({ active: event.detail });\n  },\n});\n

自定义颜色

<van-tabbar\n  active="{{ active }}"\n  active-color="#07c160"\n  inactive-color="#000"\n  bind:change="onChange"\n>\n  <van-tabbar-item icon="home-o">标签</van-tabbar-item>\n  <van-tabbar-item icon="search">标签</van-tabbar-item>\n  <van-tabbar-item icon="friends-o">标签</van-tabbar-item>\n  <van-tabbar-item icon="setting-o">标签</van-tabbar-item>\n</van-tabbar>\n
Page({\n  data: {\n    active: 0,\n  },\n  onChange(event) {\n    this.setData({ active: event.detail });\n  },\n});\n

切换标签事件

<van-tabbar active="{{ active }}" bind:change="onChange">\n  <van-tabbar-item icon="home-o">标签1</van-tabbar-item>\n  <van-tabbar-item icon="search">标签2</van-tabbar-item>\n  <van-tabbar-item icon="friends-o">标签3</van-tabbar-item>\n  <van-tabbar-item icon="setting-o">标签4</van-tabbar-item>\n</van-tabbar>\n
Page({\n  data: {\n    active: 0,\n  },\n  onClick(event) {\n    wx.showToast({\n      title: `点击标签 ${event.detail + 1}`,\n      icon: 'none',\n    });\n  },\n});\n

结合自定义 tabBar

请参考 微信官方文档代码片段

API

Tabbar Props

参数说明类型默认值
active当前选中标签的索引number-
fixed是否固定在底部booleantrue
placeholder固定在底部时,是否在标签位置生成一个等高的占位元素booleanfalse
border是否展示外边框booleantrue
z-index元素 z-indexnumber1
active-color选中标签的颜色string#1989fa
inactive-color未选中标签的颜色string#7d7e80
safe-area-inset-bottom是否为 iPhoneX 留出底部安全距离booleantrue

Tabbar Event

事件名说明参数
bind:change切换标签时触发event.detail: 当前选中标签的名称或索引值

TabbarItem Props

参数说明类型默认值
name标签名称,作为匹配的标识符string | number当前标签的索引值
icon图标名称或图片链接,可选值见 Icon 组件string-
icon-prefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
dot是否显示小红点boolean-
info图标右上角提示信息string | number-

TabbarItem Slot

名称说明
icon未选中时的图标
icon-active选中时的图标
',16)],fh={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",vh,bh)))},yh={class:"van-doc-markdown-body"},qh=[wn('

Tag 标签

介绍

用于标记关键词和概括主要内容。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-tag": "@vant/weapp/tag/index"\n}\n

代码演示

基础用法

通过 type 属性控制标签颜色,默认为灰色。

<van-tag type="primary">标签</van-tag>\n<van-tag type="success">标签</van-tag>\n<van-tag type="danger">标签</van-tag>\n<van-tag type="warning">标签</van-tag>\n

空心样式

设置 plain 属性设置为空心样式。

<van-tag plain type="primary">标签</van-tag>\n<van-tag plain type="success">标签</van-tag>\n<van-tag plain type="danger">标签</van-tag>\n<van-tag plain type="warning">标签</van-tag>\n

圆角样式

通过 round 设置为圆角样式。

<van-tag round type="primary">标签</van-tag>\n<van-tag round type="success">标签</van-tag>\n<van-tag round type="danger">标签</van-tag>\n<van-tag round type="warning">标签</van-tag>\n

标记样式

通过 mark 设置为标记样式(半圆角)。

<van-tag mark type="primary">标签</van-tag>\n<van-tag mark type="success">标签</van-tag>\n<van-tag mark type="danger">标签</van-tag>\n<van-tag mark type="warning">标签</van-tag>\n

自定义颜色

<van-tag color="#f2826a">标签</van-tag>\n<van-tag color="#7232dd">标签</van-tag>\n<van-tag color="#7232dd" plain>标签</van-tag>\n<van-tag color="#ffe1e1" text-color="#ad0000">标签</van-tag>\n

标签大小

<van-tag type="danger">标签</van-tag>\n<van-tag type="danger" size="medium">标签</van-tag>\n<van-tag type="danger" size="large">标签</van-tag>\n

可关闭标签

添加 closeable 属性表示标签是可关闭的,关闭标签时会触发 close 事件,在 close 事件中可以执行隐藏标签的逻辑。

<van-tag\n  wx:if="{{ show.primary }}"\n  closeable\n  size="medium"\n  type="primary"\n  id="primary"\n  bind:close="onClose"\n>\n  标签\n</van-tag>\n<van-tag\n  wx:if="{{ show.success }}"\n  closeable\n  size="medium"\n  type="success"\n  id="success"\n  bind:close="onClose"\n>\n  标签\n</van-tag>\n
Page({\n  data: {\n    show: {\n      primary: true,\n      success: true,\n    },\n  },\n  onClose(event) {\n    this.setData({\n      [`show.${event.target.id}`]: false,\n    });\n  },\n});\n

API

Props

参数说明类型默认值
type类型,可选值为 primary success danger warningstring-
size大小, 可选值为 large mediumstring-
color标签颜色string-
plain是否为空心样式booleanfalse
round是否为圆角样式booleanfalse
mark是否为标记样式booleanfalse
text-color文本颜色,优先级高于 color 属性stringwhite
closeable是否为可关闭标签booleanfalse

Slot

名称说明
-自定义 Tag 显示内容

Events

事件名说明回调参数
close关闭标签时触发-

外部样式类

类名说明
custom-class根节点样式类
',16)],xh={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",yh,qh)))},wh={class:"van-doc-markdown-body"},_h=[wn('

Toast 轻提示

介绍

在页面中间弹出黑色半透明提示,用于消息通知、加载提示、操作结果提示等场景。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-toast": "@vant/weapp/toast/index"\n}\n

代码演示

文字提示

import Toast from 'path/to/@vant/weapp/dist/toast/toast';\n\nToast('我是提示文案,建议不超过十五字~');\n
<van-toast id="van-toast" />\n

加载提示

使用 Toast.loading 方法展示加载提示,通过 forbidClick 属性可以禁用背景点击,通过 loadingType 属性可以自定义加载图标类型。

Toast.loading({\n  message: '加载中...',\n  forbidClick: true,\n});\n\n// 自定义加载图标\nToast.loading({\n  message: '加载中...',\n  forbidClick: true,\n  loadingType: 'spinner',\n});\n

成功/失败提示

Toast.success('成功文案');\nToast.fail('失败文案');\n

动态更新提示

const toast = Toast.loading({\n  duration: 0, // 持续展示 toast\n  forbidClick: true,\n  message: '倒计时 3 秒',\n  selector: '#custom-selector',\n});\n\nlet second = 3;\nconst timer = setInterval(() => {\n  second--;\n  if (second) {\n    toast.setData({\n      message: `倒计时 ${second} 秒`,\n    });\n  } else {\n    clearInterval(timer);\n    Toast.clear();\n  }\n}, 1000);\n
<van-toast id="custom-selector" />\n

OnClose 回调函数

Toast({\n  type: 'success',\n  message: '提交成功',\n  onClose: () => {\n    console.log('执行OnClose函数');\n  },\n});\n

API

方法

方法名参数返回值介绍
Toastoptions | messagetoast 实例展示提示
Toast.loadingoptions | messagetoast 实例展示加载提示
Toast.successoptions | messagetoast 实例展示成功提示
Toast.failoptions | messagetoast 实例展示失败提示
Toast.clearclearAllvoid关闭提示
Toast.setDefaultOptionsoptionsvoid修改默认配置,对所有 Toast 生效
Toast.resetDefaultOptions-void重置默认配置,对所有 Toast 生效

Options

参数说明类型默认值
type提示类型,可选值为 loading success fail htmlstringtext
position位置,可选值为 top middle bottomstringmiddle
message内容string''
mask是否显示遮罩层booleanfalse
forbidClick是否禁止背景点击booleanfalse
loadingType加载图标类型, 可选值为 spinnerstringcircular
zIndexz-index 层级number1000
duration展示时长(ms),值为 0 时,toast 不会消失number2000
selector自定义选择器stringvan-toast
context选择器的选择范围,可以传入自定义组件的 this 作为上下文object当前页面
onClose关闭时的回调函数Function-

Slot

名称说明
-自定义内容
',13)],kh={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",wh,_h)))},Sh={class:"van-doc-markdown-body"},Ch=[wn('

Transition 动画

介绍

使元素从一种样式逐渐变化为另一种样式的效果。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-transition": "@vant/weapp/transition/index"\n}\n

代码演示

基础用法

将元素包裹在 transition 组件内,在元素展示/隐藏时,会有相应的过渡动画。

<van-transition show="{{ show }}" custom-class="block">内容</van-transition>\n

动画类型

transition 组件内置了多种动画,可以通过name字段指定动画类型。

<van-transition name="fade-up" />\n

高级用法

可以通过外部样式类自定义过渡效果,还可以定制进入和移出的持续时间。

<van-transition\n  show="{{ show }}"\n  name=""\n  duration="{{ { enter: 300, leave: 1000 } }}"\n  enter-class="van-enter-class"\n  enter-active-class="van-enter-active-class"\n  leave-active-class="van-leave-active-class"\n  leave-to-class="van-leave-to-class"\n/>\n
.van-enter-active-class,\n.van-leave-active-class {\n  transition-property: background-color, transform;\n}\n\n.van-enter-class,\n.van-leave-to-class {\n  background-color: red;\n  transform: rotate(-360deg) translate3d(-100%, -100%, 0);\n}\n

API

Props

参数说明类型默认值
name动画类型stringfade
show是否展示组件booleantrue
duration动画时长,单位为毫秒number | object300
custom-style自定义样式string-

Events

事件名说明参数
bind:before-enter进入前触发-
bind:enter进入中触发-
bind:after-enter进入后触发-
bind:before-leave离开前触发-
bind:leave离开中触发-
bind:after-leave离开后触发-

外部样式类

类名说明
custom-class根节点样式类
enter-class定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
enter-active-class定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。
enter-to-class定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 enter-class 被移除),在过渡/动画完成之后移除。
leave-class定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。
leave-active-class定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。
leave-to-class定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 leave-class 被删除),在过渡/动画完成之后移除。

动画类型

名称说明
fade淡入
fade-up上滑淡入
fade-down下滑淡入
fade-left左滑淡入
fade-right右滑淡入
slide-up上滑进入
slide-down下滑进入
slide-left左滑进入
slide-right右滑进入
',12)],zh={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Sh,Ch)))},Ph={class:"van-doc-markdown-body"},Ih=[wn('

TreeSelect 分类选择

介绍

用于从一组相关联的数据集合中进行选择。

引入

app.jsonindex.json中引入组件,详细介绍见快速上手

"usingComponents": {\n  "van-tree-select": "@vant/weapp/tree-select/index"\n}\n

代码演示

单选模式

可以在任意位置上使用 van-tree-select 标签。传入对应的数据即可。此组件支持单选或多选,具体行为完全基于事件 click-item 的实现逻辑如何为属性 active-id 赋值,当 active-id 为数组时即为多选状态。

<van-tree-select\n  items="{{ items }}"\n  main-active-index="{{ mainActiveIndex }}"\n  active-id="{{ activeId }}"\n  bind:click-nav="onClickNav"\n  bind:click-item="onClickItem"\n/>\n
Page({\n  data: {\n    mainActiveIndex: 0,\n    activeId: null,\n  },\n\n  onClickNav({ detail = {} }) {\n    this.setData({\n      mainActiveIndex: detail.index || 0,\n    });\n  },\n\n  onClickItem({ detail = {} }) {\n    const activeId = this.data.activeId === detail.id ? null : detail.id;\n\n    this.setData({ activeId });\n  },\n});\n

多选模式

<van-tree-select\n  items="{{ items }}"\n  main-active-index="{{ mainActiveIndex }}"\n  active-id="{{ activeId }}"\n  max="{{ max }}"\n  bind:click-nav="onClickNav"\n  bind:click-item="onClickItem"\n/>\n
Page({\n  data: {\n    mainActiveIndex: 0,\n    activeId: [],\n    max: 2,\n  },\n\n  onClickNav({ detail = {} }) {\n    this.setData({\n      mainActiveIndex: detail.index || 0,\n    });\n  },\n\n  onClickItem({ detail = {} }) {\n    const { activeId } = this.data;\n\n    const index = activeId.indexOf(detail.id);\n    if (index > -1) {\n      activeId.splice(index, 1);\n    } else {\n      activeId.push(detail.id);\n    }\n\n    this.setData({ activeId });\n  },\n});\n

自定义内容

<van-tree-select\n  items="{{ items }}"\n  height="55vw"\n  main-active-index="{{ mainActiveIndex }}"\n  active-id="{{ activeId }}"\n  bind:click-nav="onClickNav"\n  bind:click-item="onClickItem"\n>\n  <image src="https://img.yzcdn.cn/vant/apple-1.jpg" slot="content" />\n</van-tree-select>\n

API

Props

参数说明类型默认值
items分类显示所需的数据Array[]
height高度,默认单位为pxnumber | string300
main-active-index左侧选中项的索引number0
active-id右侧选中项的 id,支持传入数组string | number | Array0
max右侧项最大选中个数numberInfinity
selected-icon v1.5.0自定义右侧栏选中状态的图标stringsuccess

Events

事件名说明回调参数
bind:click-nav左侧导航点击时,触发的事件event.detail.index:被点击的导航的索引
bind:click-item右侧选择项被点击时,会触发的事件event.detail: 该点击项的数据

Slots

名称说明
content自定义右侧区域内容,如果存在 items,则插入在顶部

items 数据结构

items 整体为一个数组,数组内包含一系列描述分类的对象。每个分类里,text 表示当前分类的名称。children 表示分类里的可选项,为数组结构,id 被用来唯一标识每个选项。

[\n  {\n    // 导航名称\n    text: '所有城市',\n    // 导航名称右上角徽标,1.5.0 版本开始支持\n    badge: 3,\n    // 是否在导航名称右上角显示小红点,1.5.0 版本开始支持\n    dot: true,\n    // 禁用选项\n    disabled: false,\n    // 该导航下所有的可选项\n    children: [\n      {\n        // 名称\n        text: '温州',\n        // id,作为匹配选中状态的标识\n        id: 1,\n        // 禁用选项\n        disabled: true,\n      },\n      {\n        text: '杭州',\n        id: 2,\n      },\n    ],\n  },\n];\n

外部样式类

类名说明
main-item-class左侧选项样式类
content-item-class右侧选项样式类
main-active-class左侧选项选中样式类
content-active-class右侧选项选中样式类
main-disabled-class左侧选项禁用样式类
content-disabled-class右侧选项禁用样式类
',13)],Oh={setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Ph,Ih)))},Eh={class:"van-doc-markdown-body"},Dh=[wn('

Uploader 文件上传

介绍

用于将本地的图片或文件上传至服务器,并在上传过程中展示预览图和上传进度。目前 Uploader 组件不包含将文件上传至服务器的接口逻辑,该步骤需要自行实现。

引入

app.jsonindex.json中引入组件,默认为ES6版本,ES5引入方式参见快速上手

"usingComponents": {\n  "van-uploader": "@vant/weapp/uploader/index"\n}\n

Vant Weapp 1.0 版本开始支持此组件,升级方式参见快速上手

代码演示

基础用法

文件上传完毕后会触发after-read回调函数,获取到对应的文件的临时地址,然后再使用wx.uploadFile将图片上传到远程服务器上。

<van-uploader file-list="{{ fileList }}" bind:after-read="afterRead" />\n
Page({\n  data: {\n    fileList: [],\n  },\n\n  afterRead(event) {\n    const { file } = event.detail;\n    // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式\n    wx.uploadFile({\n      url: 'https://example.weixin.qq.com/upload', // 仅为示例,非真实的接口地址\n      filePath: file.url,\n      name: 'file',\n      formData: { user: 'test' },\n      success(res) {\n        // 上传完成需要更新 fileList\n        const { fileList = [] } = this.data;\n        fileList.push({ ...file, url: res.data });\n        this.setData({ fileList });\n      },\n    });\n  },\n});\n

图片预览

通过向组件传入file-list属性,可以绑定已经上传的图片列表,并展示图片列表的预览图。file-list 的详细结构可见下方。

<van-uploader file-list="{{ fileList }}" />\n
Page({\n  data: {\n    fileList: [\n      {\n        url: 'https://img.yzcdn.cn/vant/leaf.jpg',\n        name: '图片1',\n      },\n      // Uploader 根据文件后缀来判断是否为图片文件\n      // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明\n      {\n        url: 'http://iph.href.lu/60x60?text=default',\n        name: '图片2',\n        isImage: true,\n        deletable: true,\n      },\n    ],\n  },\n});\n

图片可删除状态

通过deletable属性可控制是否开启所有图片的可删除状态,deletable默认为true,即所有图片都可删除。

若希望控制单张图片的可删除状态,可将deletable属性设置为true,并在fileList中为每一项设置deletable属性。

<van-uploader file-list="{{ fileList }}" deletable="{{ true }}" />\n
Page({\n  data: {\n    fileList: [\n      {\n        url: 'https://img.yzcdn.cn/vant/leaf.jpg',\n      },\n      {\n        url: 'https://img.yzcdn.cn/vant/tree.jpg',\n        deletable: false,\n      },\n    ],\n  },\n});\n

上传状态

通过status属性可以标识上传状态,uploading表示上传中,failed表示上传失败,done表示上传完成。

<van-uploader file-list="{{ fileList }}" />\n
Page({\n  data: {\n    fileList: [\n      {\n        url: 'https://img.yzcdn.cn/vant/leaf.jpg',\n        status: 'uploading',\n        message: '上传中',\n      },\n      {\n        url: 'https://img.yzcdn.cn/vant/tree.jpg',\n        status: 'failed',\n        message: '上传失败',\n      },\n    ],\n  },\n});\n

限制上传数量

通过max-count属性可以限制上传文件的数量,上传数量达到限制后,会自动隐藏上传区域。

<van-uploader\n  file-list="{{ fileList }}"\n  max-count="2"\n  bind:after-read="afterRead"\n/>\n

自定义上传样式

通过插槽可以自定义上传区域的样式。

<van-uploader>\n  <van-button icon="photo" type="primary">上传图片</van-button>\n</van-uploader>\n

上传前校验

use-before-read属性设置为true,然后绑定 before-read 事件可以在上传前进行校验,调用 callback 方法传入 true 表示校验通过,传入 false 表示校验失败。

<van-uploader\n  file-list="{{ fileList }}"\n  accept="media"\n  use-before-read\n  bind:before-read="beforeRead"\n  bind:after-read="afterRead"\n/>\n
Page({\n  data: {\n    fileList: [],\n  },\n\n  beforeRead(event) {\n    const { file, callback } = event.detail;\n    callback(file.type === 'image');\n  },\n});\n

云开发示例

上传图片至云存储

在开发中,可以利用小程序云开发的云存储能力,将图片上传至云存储内。然后根据返回的fileiId来下载图片、删除图片和替换临时链接。

// 上传图片\nuploadToCloud() {\n  wx.cloud.init();\n  const { fileList } = this.data;\n  if (!fileList.length) {\n    wx.showToast({ title: '请选择图片', icon: 'none' });\n  } else {\n    const uploadTasks = fileList.map((file, index) => this.uploadFilePromise(`my-photo${index}.png`, file));\n    Promise.all(uploadTasks)\n      .then(data => {\n        wx.showToast({ title: '上传成功', icon: 'none' });\n        const newFileList = data.map(item => ({ url: item.fileID }));\n        this.setData({ cloudPath: data, fileList: newFileList });\n      })\n      .catch(e => {\n        wx.showToast({ title: '上传失败', icon: 'none' });\n        console.log(e);\n      });\n  }\n}\n\nuploadFilePromise(fileName, chooseResult) {\n  return wx.cloud.uploadFile({\n    cloudPath: fileName,\n    filePath: chooseResult.url\n  });\n}\n

API

Props

参数说明类型默认值
name标识符,可以在回调函数的第二项参数中获取string | number-
accept接受的文件类型, 可选值为all media image file videostringimage
sizeType所选的图片的尺寸, 当acceptimage类型时设置所选图片的尺寸可选值为original compressedstring[]['original','compressed']
preview-size预览图和上传区域的尺寸,默认单位为pxstring | number80px
preview-image是否在上传完成后展示预览图booleantrue
preview-full-image是否在点击预览图后展示全屏图片预览booleantrue
multiple是否开启图片多选,部分安卓机型不支持booleanfalse
disabled是否禁用文件上传booleanfalse
show-upload是否展示文件上传按钮booleantrue
deletable是否展示删除按钮booleantrue
capture图片或者视频选取模式,当acceptimage类型时设置capture可选值为camera可以直接调起摄像头string | string[]['album', 'camera']
max-size文件大小限制,单位为bytenumber-
max-count文件上传数量限制number-
upload-text上传区域文字提示string-
image-fit预览图裁剪模式,可选值参考小程序image组件的mode属性stringscaleToFill
use-before-read是否开启文件读取前事件boolean-
camera当 accept 为 video 时生效,可选值为 back frontstring-
compressed当 accept 为 video 时生效,是否压缩视频,默认为trueboolean-
max-duration当 accept 为 video 时生效,拍摄视频最长拍摄时间,单位秒number-
upload-icon上传区域图标,可选值见 Icon 组件stringplus

accept 的合法值

参数说明
media图片和视频
image图片
video视频
file从客户端会话选择图片和视频以外的文件
all从客户端会话选择所有文件

FileList

file-list 为一个对象数组,数组中的每一个对象包含以下 key

参数说明
url图片和视频的网络资源地址
name文件名称,视频将在全屏预览时作为标题显示
thumb图片缩略图或视频封面的网络资源地址,仅对图片和视频有效
type文件类型,可选值image video file
isImage手动标记图片资源
isVideo手动标记视频资源

Slot

名称说明
-自定义上传区域

Event

事件名说明回调参数
bind:before-read文件读取前,在回调函数中返回 false 可终止文件读取,绑定事件的同时需要将use-before-read属性设置为trueevent.detail.file: 当前读取的文件,event.detail.callback: 回调函数,调用callback(false)终止文件读取
bind:after-read文件读取完成后event.detail.file: 当前读取的文件
bind:oversize文件超出大小限制-
bind:click-preview点击预览图片event.detail.index: 点击图片的序号值
bind:delete删除图片event.detail.index: 删除图片的序号值
',18)],Th={name:"vant-weapp",build:{srcDir:"packages",site:{publicPath:"/vant-weapp/vite/"}},site:{versions:[{label:"0.x",link:"/vant-weapp/0.x"}],title:"Vant Weapp",description:"轻量、可靠的小程序 UI 组件库",logo:"https://img.yzcdn.cn/vant/logo.png",simulator:{url:"https://vant-contrib.gitee.io/vant/mobile.html?weapp=1",routeMapper:s=>`/zh-CN${{"/common":"/style","/transition":"/style"}[s]||s}`,syncPathFromSimulator:!1},links:[{logo:"https://img.yzcdn.cn/vant/vant-o.svg",url:"https://vant-contrib.gitee.io/vant/"},{logo:"https://b.yzcdn.cn/vant/logo/github.svg",url:"https://github.com/youzan/vant-weapp"}],baiduAnalytics:{seed:"ad6b5732c36321f2dafed737ac2da92f"},nav:[{title:"开发指南",items:[{path:"home",title:"介绍"},{path:"quickstart",title:"快速上手"},{path:"changelog",title:"更新日志"},{path:"custom-style",title:"样式覆盖"},{path:"theme",title:"定制主题"}]},{title:"基础组件",items:[{path:"button",title:"Button 按钮"},{path:"cell",title:"Cell 单元格"},{path:"config-provider",title:"ConfigProvider 全局配置"},{path:"icon",title:"Icon 图标"},{path:"image",title:"Image 图片"},{path:"col",title:"Layout 布局"},{path:"popup",title:"Popup 弹出层"},{path:"common",title:"Style 内置样式"},{path:"toast",title:"Toast 轻提示"},{path:"transition",title:"transition 动画"}]},{title:"表单组件",items:[{path:"calendar",title:"Calendar 日历"},{path:"checkbox",title:"Checkbox 复选框"},{path:"datetime-picker",title:"DatetimePicker 时间选择"},{path:"field",title:"Field 输入框"},{path:"picker",title:"Picker 选择器"},{path:"radio",title:"Radio 单选框"},{path:"rate",title:"Rate 评分"},{path:"search",title:"Search 搜索"},{path:"slider",title:"Slider 滑块"},{path:"stepper",title:"Stepper 步进器"},{path:"switch",title:"Switch 开关"},{path:"uploader",title:"Uploader 文件上传"}]},{title:"反馈组件",items:[{path:"action-sheet",title:"ActionSheet 动作面板"},{path:"dialog",title:"Dialog 弹出框"},{path:"dropdown-menu",title:"DropdownMenu 下拉菜单"},{path:"loading",title:"Loading 加载"},{path:"notify",title:"Notify 消息通知"},{path:"overlay",title:"Overlay 遮罩层"},{path:"share-sheet",title:"ShareSheet 分享面板"},{path:"swipe-cell",title:"SwipeCell 滑动单元格"}]},{title:"展示组件",items:[{path:"circle",title:"Circle 环形进度条"},{path:"collapse",title:"Collapse 折叠面板"},{path:"count-down",title:"CountDown 倒计时"},{path:"divider",title:"Divider 分割线"},{path:"empty",title:"Empty 空状态"},{path:"notice-bar",title:"NoticeBar 通知栏"},{path:"progress",title:"Progress 进度条"},{path:"skeleton",title:"Skeleton 骨架屏"},{path:"steps",title:"Steps 步骤条"},{path:"sticky",title:"Sticky 粘性布局"},{path:"tag",title:"Tag 标签"}]},{title:"导航组件",items:[{path:"grid",title:"Grid 宫格"},{path:"index-bar",title:"IndexBar 索引栏"},{path:"nav-bar",title:"NavBar 导航栏"},{path:"sidebar",title:"Sidebar 侧边导航"},{path:"tab",title:"Tab 标签页"},{path:"tabbar",title:"Tabbar 标签栏"},{path:"tree-select",title:"TreeSelect 分类选择"}]},{title:"业务组件",items:[{path:"area",title:"Area 省市区选择"},{path:"card",title:"Card 商品卡片"},{path:"submit-bar",title:"SubmitBar 提交订单栏"},{path:"goods-action",title:"GoodsAction 商品导航"}]},{title:"废弃",items:[{path:"panel",title:"Panel 面板"}]}]}},Ah={Changelog:vd,CustomStyle:qd,Home:kd,Quickstart:Pd,Theme:Dd,ActionSheet:Fd,Area:Md,Button:Hd,Calendar:Qd,Card:Jd,Cell:ar,Checkbox:er,Circle:cr,Col:rr,Collapse:ur,Common:mr,ConfigProvider:fr,CountDown:xr,DatetimePicker:kr,Dialog:zr,Divider:Or,DropdownMenu:Tr,Empty:Fr,Field:Br,GoodsAction:Ur,Grid:Wr,Icon:Qr,Image:Jr,IndexBar:ai,Loading:ei,NavBar:ci,NoticeBar:ri,Notify:ui,Overlay:mi,Panel:fi,Picker:xi,Popup:ki,Progress:zi,Radio:Oi,Rate:Ti,Search:Fi,ShareSheet:Bi,Sidebar:Ui,Skeleton:Wi,Slider:Qi,Stepper:Ji,Steps:ah,Sticky:eh,SubmitBar:ch,SwipeCell:rh,Switch:uh,Tab:mh,Tabbar:fh,Tag:xh,Toast:kh,Transition:zh,TreeSelect:Oh,Uploader:{setup:(s,{expose:a})=>(a({frontmatter:{}}),(s,a)=>(cn(),hn("div",Eh,Dh)))}};const Nh={class:"van-doc-header"},Fh={class:"van-doc-row"},Lh={class:"van-doc-header__top"},Rh={class:"van-doc-header__logo"},Bh=["src"],Mh={class:"van-doc-header__top-nav"},$h=["href"],Uh=["src"],Vh={key:1},Hh={key:0,ref:"version",class:"van-doc-header__top-nav-item"},Wh={key:0,class:"van-doc-header__version-pop"},Gh=["onClick"],Kh={key:1,class:"van-doc-header__top-nav-item"},Qh=["href"];const Yh={name:"VanDocContainer",props:{hasSimulator:Boolean}};const Xh=["src"];const Jh={name:"VanDoc",components:{DocNav:rl,DocHeader:el({name:"VanDocHeader",components:{SearchInput:ud},props:{lang:String,config:Object,versions:Array,langConfigs:Array},data:()=>({packageVersion:"1.9.0",showVersionPop:!1}),computed:{langLink(){return`#${this.$route.path.replace(this.lang,this.anotherLang.lang)}`},langLabel(){return this.anotherLang.label},anotherLang(){const s=this.langConfigs.filter((s=>s.lang!==this.lang));return s.length?s[0]:{}},searchConfig(){return this.config.searchConfig}},methods:{toggleVersionPop(){const s=!this.showVersionPop,a=s?"add":"remove";document.body[`${a}EventListener`]("click",this.checkHideVersionPop),this.showVersionPop=s},checkHideVersionPop(s){this.$refs.version.contains(s.target)||(this.showVersionPop=!1)},onSwitchLang(s){this.$router.push(this.$route.path.replace(s.from,s.to))},onSwitchVersion(s){s.link&&(location.href=s.link)}}},[["render",function(s,a,t,n,e,l){const p=Xt("search-input");return cn(),hn("div",Nh,[fn("div",Fh,[fn("div",Lh,[fn("a",Rh,[fn("img",{src:t.config.logo},null,8,Bh),fn("span",null,j(t.config.title),1)]),fn("ul",Mh,[(cn(!0),hn(an,null,zn(t.config.links,((s,a)=>(cn(),hn("li",{key:a,class:"van-doc-header__top-nav-item"},[fn("a",{class:"van-doc-header__link",target:"_blank",href:s.url},[s.logo?(cn(),hn("img",{key:0,src:s.logo},null,8,Uh)):s.text?(cn(),hn("span",Vh,j(s.text),1)):_n("v-if",!0)],8,$h)])))),128)),t.versions?(cn(),hn("li",Hh,[fn("span",{class:"van-doc-header__cube van-doc-header__version",onClick:a[0]||(a[0]=(...s)=>l.toggleVersionPop&&l.toggleVersionPop(...s))},[xn(j(e.packageVersion)+" ",1),yn(Me,{name:"van-doc-dropdown"},{default:Da((()=>[e.showVersionPop?(cn(),hn("div",Wh,[(cn(!0),hn(an,null,zn(t.versions,((s,a)=>(cn(),hn("div",{key:a,class:"van-doc-header__version-pop-item",onClick:a=>l.onSwitchVersion(s)},j(s.label),9,Gh)))),128))])):_n("v-if",!0)])),_:1})])],512)):_n("v-if",!0),l.langLabel&&l.langLink?(cn(),hn("li",Kh,[fn("a",{class:"van-doc-header__cube",href:l.langLink},j(l.langLabel),9,Qh)])):_n("v-if",!0),l.searchConfig?(cn(),un(p,{key:2,lang:t.lang,"search-config":l.searchConfig},null,8,["lang","search-config"])):_n("v-if",!0)])])])])}]]),DocContent:el({name:"VanDocContent",computed:{currentPage(){const{path:s}=this.$route;return s?s.split("/").slice(-1)[0]:this.$route.name}}},[["render",function(s,a,t,n,e,l){return cn(),hn("div",{class:g(["van-doc-content",`van-doc-content--${l.currentPage}`])},[Pn(s.$slots,"default")],2)}]]),DocContainer:el(Yh,[["render",function(s,a,t,n,e,l){return cn(),hn("div",{class:g(["van-doc-container van-doc-row",{"van-doc-container--with-simulator":t.hasSimulator}])},[Pn(s.$slots,"default")],2)}]]),DocSimulator:el({name:"VanDocSimulator",props:{src:String},data:()=>({scrollTop:window.scrollY,windowHeight:window.innerHeight}),computed:{isFixed(){return this.scrollTop>60},simulatorStyle(){return{height:Math.min(640,this.windowHeight-90)+"px"}}},mounted(){window.addEventListener("scroll",(()=>{this.scrollTop=window.scrollY})),window.addEventListener("resize",(()=>{this.windowHeight=window.innerHeight}))}},[["render",function(s,a,t,n,e,l){return cn(),hn("div",{class:g(["van-doc-simulator",{"van-doc-simulator-fixed":l.isFixed}])},[fn("iframe",{ref:"iframe",src:t.src,style:r(l.simulatorStyle),frameborder:"0"},null,12,Xh)],2)}]])},props:{lang:String,versions:Array,simulator:String,hasSimulator:Boolean,langConfigs:Array,config:{type:Object,required:!0},base:{type:String,default:""}},emits:["switch-version"],watch:{$route(){this.setNav()}},created(){this.setNav(),this.keyboardHandler()},methods:{setNav(){const{nav:s}=this.config,a=s.reduce(((s,a)=>s.concat(a.items)),[]),t=this.$route.path.split("/").pop();let n;for(let e=0,l=a.length;e{switch(s.keyCode){case 37:this.keyboardNav("prev");break;case 39:this.keyboardNav("next")}}))}}},Zh={class:"van-doc"};let su="zh-CN";function au(){return su}function tu(s){const a=localStorage.getItem("vant-cli-lang");su=a||(navigator.language&&-1!==navigator.language.indexOf("zh-")?"zh-CN":s||"en-US")}const nu={class:"app"};var eu=el({components:{VanDoc:el(Jh,[["render",function(s,a,t,n,e,l){const p=Xt("doc-header"),c=Xt("doc-nav"),o=Xt("doc-content"),d=Xt("doc-container"),r=Xt("doc-simulator");return cn(),hn("div",Zh,[yn(p,{lang:t.lang,config:t.config,versions:t.versions,"lang-configs":t.langConfigs,onSwitchVersion:a[0]||(a[0]=a=>s.$emit("switch-version",a))},null,8,["lang","config","versions","lang-configs"]),yn(c,{lang:t.lang,"nav-config":t.config.nav},null,8,["lang","nav-config"]),yn(d,{"has-simulator":t.hasSimulator},{default:Da((()=>[yn(o,null,{default:Da((()=>[Pn(s.$slots,"default")])),_:3})])),_:3},8,["has-simulator"]),t.hasSimulator?(cn(),un(r,{key:0,src:t.simulator},null,8,["src"])):_n("v-if",!0)])}]])},data:()=>({hasSimulator:!0}),computed:{simulator(){var s,a;if(null==(s=Th.site.simulator)?void 0:s.url)return null==(a=Th.site.simulator)?void 0:a.url;return`${location.pathname.replace(/\/index(\.html)?/,"/")}mobile.html${location.hash}`},lang(){const{lang:s}=this.$route.meta;return s||""},langConfigs(){const{locales:s={}}=Th.site;return Object.keys(s).map((a=>({lang:a,label:s[a].langLabel||""})))},config(){const{locales:s}=Th.site;return s?s[this.lang]:Th.site},versions:()=>Th.site.versions||null},watch:{"$route.path"(){this.setTitleAndToogleSimulator()},lang(s){var a;su=a=s,localStorage.setItem("vant-cli-lang",a),this.setTitleAndToogleSimulator()},config:{handler(s){s&&this.setTitleAndToogleSimulator()},immediate:!0}},mounted(){this.$route.hash&&this.$nextTick((()=>{const s=document.querySelector(this.$route.hash);s&&s.scrollIntoView()}))},methods:{setTitleAndToogleSimulator(){let{title:s}=this.config;const a=this.config.nav.reduce(((s,a)=>[...s,...a.items]),[]).find((s=>s.path===this.$route.meta.name));a&&a.title?s=a.title+" - "+s:this.config.description&&(s+=` - ${this.config.description}`),document.title=s,this.hasSimulator=!(Th.site.hideSimulator||this.config.hideSimulator||a&&a.hideSimulator)}}},[["render",function(s,a,t,n,e,l){const p=Xt("router-view"),c=Xt("van-doc");return cn(),hn("div",nu,[l.config?(cn(),un(c,{key:0,lang:l.lang,config:l.config,versions:l.versions,simulator:l.simulator,"has-simulator":e.hasSimulator,"lang-configs":l.langConfigs},{default:Da((()=>[yn(p)])),_:1},8,["lang","config","versions","simulator","has-simulator","lang-configs"])):_n("v-if",!0)])}]]);const lu={name:"DemoPlayground",props:{originCode:String,codeSnippet:String,transform:Boolean,compact:Boolean,inline:Boolean},data:()=>({showSource:!1,copyStatus:"ready"}),methods:{unescape:unescape,toogleSource(){this.showSource=!this.showSource},copySourceCode(){!function(s){const a=document.createElement("textarea");a.value=s,a.setAttribute("readonly",""),a.style.position="absolute",a.style.left="-9999px",document.body.appendChild(a);const t=document.getSelection();if(!t)return;const n=t.rangeCount>0&&t.getRangeAt(0);a.select(),document.execCommand("copy"),document.body.removeChild(a),n&&(t.removeAllRanges(),t.addRange(n))}(unescape(this.originCode)),this.copyStatus="copied",setTimeout((()=>{this.copyStatus="ready"}),2e3)}}},pu={class:"demo-playground--code"},cu={class:"demo-playground--code--actions"},ou=(s=>(Oa="data-v-9efa7fdc",s=s(),Oa=null,s))((()=>fn("span",null,null,-1))),du=["data-status"],ru=["innerHTML"];var iu=el(lu,[["render",function(s,a,t,n,e,l){return cn(),hn("div",{class:g({"demo-playground":!t.inline,transform:t.transform})},[t.inline?Pn(s.$slots,"default",{key:0},void 0,!0):(cn(),hn(an,{key:1},[fn("div",{class:g(["demo-playground--previewer",{compact:t.compact}])},[Pn(s.$slots,"default",{},void 0,!0)],2),fn("div",pu,[fn("div",cu,[ou,fn("button",{title:"Copy source code",class:"action-icon",role:"copy","data-status":e.copyStatus,onClick:a[0]||(a[0]=(...s)=>l.copySourceCode&&l.copySourceCode(...s))},null,8,du),fn("button",{title:"Toggle source code panel",class:"action-icon",role:"source",onClick:a[1]||(a[1]=(...s)=>l.toogleSource&&l.toogleSource(...s))})]),Mt(fn("div",{innerHTML:l.unescape(t.codeSnippet),class:"demo-playground--code--content"},null,8,ru),[[Ze,e.showSource]])])],64))],2)}],["__scopeId","data-v-9efa7fdc"]]); +/*! + * vue-router v4.0.6 + * (c) 2021 Eduardo San Martin Morote + * @license MIT + */const hu="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag,uu=s=>hu?Symbol(s):"_vr_"+s,gu=uu("rvlm"),ju=uu("rvd"),mu=uu("r"),vu=uu("rl"),bu=uu("rvl"),fu="undefined"!=typeof window;const yu=Object.assign;function qu(s,a){const t={};for(const n in a){const e=a[n];t[n]=Array.isArray(e)?e.map(s):s(e)}return t}let xu=()=>{};const wu=/\/$/;function _u(s,a,t="/"){let n,e={},l="",p="";const c=a.indexOf("?"),o=a.indexOf("#",c>-1?c:0);return c>-1&&(n=a.slice(0,c),l=a.slice(c+1,o>-1?o:a.length),e=s(l)),o>-1&&(n=n||a.slice(0,o),p=a.slice(o,a.length)),n=function(s,a){if(s.startsWith("/"))return s;if(!s)return a;const t=a.split("/"),n=s.split("/");let e,l,p=t.length-1;for(e=0;es===a[t])):1===s.length&&s[0]===a}var Iu,Ou,Eu,Du;function Tu(s){if(!s)if(fu){const a=document.querySelector("base");s=(s=a&&a.getAttribute("href")||"/").replace(/^\w+:\/\/[^\/]+/,"")}else s="/";return"/"!==s[0]&&"#"!==s[0]&&(s="/"+s),s.replace(wu,"")}(Ou=Iu||(Iu={})).pop="pop",Ou.push="push",(Du=Eu||(Eu={})).back="back",Du.forward="forward",Du.unknown="";const Au=/^[^#]+#/;function Nu(s,a){return s.replace(Au,"#")+a}const Fu=()=>({left:window.pageXOffset,top:window.pageYOffset});function Lu(s){let a;if("el"in s){let t=s.el;const n="string"==typeof t&&t.startsWith("#"),e="string"==typeof t?n?document.getElementById(t.slice(1)):document.querySelector(t):t;if(!e)return;a=function(s,a){const t=document.documentElement.getBoundingClientRect(),n=s.getBoundingClientRect();return{behavior:a.behavior,left:n.left-t.left-(a.left||0),top:n.top-t.top-(a.top||0)}}(e,s)}else a=s;"scrollBehavior"in document.documentElement.style?window.scrollTo(a):window.scrollTo(null!=a.left?a.left:window.pageXOffset,null!=a.top?a.top:window.pageYOffset)}function Ru(s,a){return(history.state?history.state.position-a:-1)+s}const Bu=new Map;function Mu(s,a){const{pathname:t,search:n,hash:e}=a;if(s.indexOf("#")>-1){let s=e.slice(1);return"/"!==s[0]&&(s="/"+s),ku(s,"")}return ku(t,s)+n+e}function $u(s,a,t,n=!1,e=!1){return{back:s,current:a,forward:t,replaced:n,position:window.history.length,scroll:e?Fu():null}}function Uu(s){const{history:a,location:t}=window;let n={value:Mu(s,t)},e={value:a.state};function l(n,l,p){const c=s.indexOf("#"),o=c>-1?(t.host&&document.querySelector("base")?s:s.slice(c))+n:location.protocol+"//"+location.host+s+n;try{a[p?"replaceState":"pushState"](l,"",o),e.value=l}catch(d){console.error(d),t[p?"replace":"assign"](o)}}return e.value||l(n.value,{back:null,current:n.value,forward:null,position:a.length-1,replaced:!0,scroll:null},!0),{location:n,state:e,push:function(s,t){const p=yu({},e.value,a.state,{forward:s,scroll:Fu()});l(p.current,p,!0),l(s,yu({},$u(n.value,s,null),{position:p.position+1},t),!1),n.value=s},replace:function(s,t){l(s,yu({},a.state,$u(e.value.back,s,e.value.forward,!0),t,{position:e.value.position}),!0),n.value=s}}}function Vu(s){const a=Uu(s=Tu(s)),t=function(s,a,t,n){let e=[],l=[],p=null;const c=({state:l})=>{const c=Mu(s,location),o=t.value,d=a.value;let r=0;if(l){if(t.value=c,a.value=l,p&&p===o)return void(p=null);r=d?l.position-d.position:0}else n(c);e.forEach((s=>{s(t.value,o,{delta:r,type:Iu.pop,direction:r?r>0?Eu.forward:Eu.back:Eu.unknown})}))};function o(){const{history:s}=window;s.state&&s.replaceState(yu({},s.state,{scroll:Fu()}),"")}return window.addEventListener("popstate",c),window.addEventListener("beforeunload",o),{pauseListeners:function(){p=t.value},listen:function(s){e.push(s);const a=()=>{const a=e.indexOf(s);a>-1&&e.splice(a,1)};return l.push(a),a},destroy:function(){for(const s of l)s();l=[],window.removeEventListener("popstate",c),window.removeEventListener("beforeunload",o)}}}(s,a.state,a.location,a.replace);const n=yu({location:"",base:s,go:function(s,a=!0){a||t.pauseListeners(),history.go(s)},createHref:Nu.bind(null,s)},a,t);return Object.defineProperty(n,"location",{get:()=>a.location.value}),Object.defineProperty(n,"state",{get:()=>a.state.value}),n}function Hu(s){return(s=location.host?s||location.pathname+location.search:"").indexOf("#")<0&&(s+="#"),Vu(s)}function Wu(s){return"string"==typeof s||"symbol"==typeof s}const Gu={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Ku=uu("nf");var Qu,Yu;function Xu(s,a){return yu(new Error,{type:s,[Ku]:!0},a)}function Ju(s,a){return s instanceof Error&&Ku in s&&(null==a||!!(s.type&a))}(Yu=Qu||(Qu={}))[Yu.aborted=4]="aborted",Yu[Yu.cancelled=8]="cancelled",Yu[Yu.duplicated=16]="duplicated";const Zu={sensitive:!1,strict:!1,start:!0,end:!0},sg=/[.+*?^${}()[\]/\\]/g;function ag(s,a){let t=0;for(;ta.length?1===a.length&&80===a[0]?1:-1:0}function tg(s,a){let t=0;const n=s.score,e=a.score;for(;t1&&("*"===c||"+"===c)&&a(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),l.push({type:1,value:d,regexp:r,repeatable:"*"===c||"+"===c,optional:"*"===c||"?"===c})):a("Invalid state to consume buffer"),d="")}function h(){d+=c}for(;o{l(h)}:xu}function l(s){if(Wu(s)){const a=n.get(s);a&&(n.delete(s),t.splice(t.indexOf(a),1),a.children.forEach(l),a.alias.forEach(l))}else{let a=t.indexOf(s);a>-1&&(t.splice(a,1),s.record.name&&n.delete(s.record.name),s.children.forEach(l),s.alias.forEach(l))}}function p(s){let a=0;for(;a=0;)a++;t.splice(a,0,s),s.record.name&&!og(s)&&n.set(s.record.name,s)}return a=rg({strict:!1,end:!0,sensitive:!1},a),s.forEach((s=>e(s))),{addRoute:e,resolve:function(s,a){let e,l,p,c={};if("name"in s&&s.name){if(e=n.get(s.name),!e)throw Xu(1,{location:s});p=e.record.name,c=yu(function(s,a){let t={};for(let n of a)n in s&&(t[n]=s[n]);return t}(a.params,e.keys.filter((s=>!s.optional)).map((s=>s.name))),s.params),l=e.stringify(c)}else if("path"in s)l=s.path,e=t.find((s=>s.re.test(l))),e&&(c=e.parse(l),p=e.record.name);else{if(e=a.name?n.get(a.name):t.find((s=>s.re.test(a.path))),!e)throw Xu(1,{location:s,currentLocation:a});p=e.record.name,c=yu({},a.params,s.params),l=e.stringify(c)}const o=[];let d=e;for(;d;)o.unshift(d.record),d=d.parent;return{name:p,path:l,params:c,matched:o,meta:dg(o)}},removeRoute:l,getRoutes:function(){return t},getRecordMatcher:function(s){return n.get(s)}}}function cg(s){const a={},t=s.props||!1;if("component"in s)a.default=t;else for(let n in s.components)a[n]="boolean"==typeof t?t:t[n];return a}function og(s){for(;s;){if(s.record.aliasOf)return!0;s=s.parent}return!1}function dg(s){return s.reduce(((s,a)=>yu(s,a.meta)),{})}function rg(s,a){let t={};for(let n in s)t[n]=n in a?a[n]:s[n];return t}const ig=/#/g,hg=/&/g,ug=/\//g,gg=/=/g,jg=/\?/g,mg=/\+/g,vg=/%5B/g,bg=/%5D/g,fg=/%5E/g,yg=/%60/g,qg=/%7B/g,xg=/%7C/g,wg=/%7D/g,_g=/%20/g;function kg(s){return encodeURI(""+s).replace(xg,"|").replace(vg,"[").replace(bg,"]")}function Sg(s){return kg(s).replace(mg,"%2B").replace(_g,"+").replace(ig,"%23").replace(hg,"%26").replace(yg,"`").replace(qg,"{").replace(wg,"}").replace(fg,"^")}function Cg(s){return function(s){return kg(s).replace(ig,"%23").replace(jg,"%3F")}(s).replace(ug,"%2F")}function zg(s){try{return decodeURIComponent(""+s)}catch(a){}return""+s}function Pg(s){const a={};if(""===s||"?"===s)return a;const t=("?"===s[0]?s.slice(1):s).split("&");for(let n=0;ns&&Sg(s))):[n&&Sg(n)];for(let s=0;snull==s?null:""+s)):null==n?n:""+n)}return a}function Eg(){let s=[];return{add:function(a){return s.push(a),()=>{const t=s.indexOf(a);t>-1&&s.splice(t,1)}},list:()=>s,reset:function(){s=[]}}}function Dg(s,a,t,n,e){const l=n&&(n.enterCallbacks[e]=n.enterCallbacks[e]||[]);return()=>new Promise(((p,c)=>{const o=s=>{var o;!1===s?c(Xu(4,{from:t,to:a})):s instanceof Error?c(s):"string"==typeof(o=s)||o&&"object"==typeof o?c(Xu(2,{from:a,to:s})):(l&&n.enterCallbacks[e]===l&&"function"==typeof s&&l.push(s),p())},d=s.call(n&&n.instances[e],a,t,o);let r=Promise.resolve(d);s.length<3&&(r=r.then(o)),r.catch((s=>c(s)))}))}function Tg(s,a,t,n){const e=[];for(const p of s)for(const s in p.components){let c=p.components[s];if("beforeRouteEnter"===a||p.instances[s])if("object"==typeof(l=c)||"displayName"in l||"props"in l||"__vccOpts"in l){const l=(c.__vccOpts||c)[a];l&&e.push(Dg(l,t,n,p,s))}else{let l=c();l=l.catch(console.error),e.push((()=>l.then((e=>{if(!e)return Promise.reject(new Error(`Couldn't resolve component "${s}" at "${p.path}"`));const l=(c=e).__esModule||hu&&"Module"===c[Symbol.toStringTag]?e.default:e;var c;p.components[s]=l;const o=(l.__vccOpts||l)[a];return o&&Dg(o,t,n,p,s)()}))))}}var l;return e}function Ag(s){const a=Ra(mu),t=Ra(vu),n=Sa((()=>a.resolve(xa(s.to)))),e=Sa((()=>{let{matched:s}=n.value,{length:a}=s;const e=s[a-1];let l=t.matched;if(!e||!l.length)return-1;let p=l.findIndex(Su.bind(null,e));if(p>-1)return p;let c=Fg(s[a-2]);return a>1&&Fg(e)===c&&l[l.length-1].path!==c?l.findIndex(Su.bind(null,s[a-2])):p})),l=Sa((()=>e.value>-1&&function(s,a){for(let t in a){let n=a[t],e=s[t];if("string"==typeof n){if(n!==e)return!1}else if(!Array.isArray(e)||e.length!==n.length||n.some(((s,a)=>s!==e[a])))return!1}return!0}(t.params,n.value.params))),p=Sa((()=>e.value>-1&&e.value===t.matched.length-1&&Cu(t.params,n.value.params)));return{route:n,href:Sa((()=>n.value.href)),isActive:l,isExactActive:p,navigate:function(t={}){return function(s){if(s.metaKey||s.altKey||s.ctrlKey||s.shiftKey)return;if(s.defaultPrevented)return;if(void 0!==s.button&&0!==s.button)return;if(s.currentTarget&&s.currentTarget.getAttribute){const a=s.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(a))return}s.preventDefault&&s.preventDefault();return!0}(t)?a[xa(s.replace)?"replace":"push"](xa(s.to)):Promise.resolve()}}}const Ng=Ka({name:"RouterLink",props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},setup(s,{slots:a}){const t=oa(Ag(s)),{options:n}=Ra(mu),e=Sa((()=>({[Lg(s.activeClass,n.linkActiveClass,"router-link-active")]:t.isActive,[Lg(s.exactActiveClass,n.linkExactActiveClass,"router-link-exact-active")]:t.isExactActive})));return()=>{const n=a.default&&a.default(t);return s.custom?n:xe("a",{"aria-current":t.isExactActive?s.ariaCurrentValue:null,href:t.href,onClick:t.navigate,class:e.value},n)}}});function Fg(s){return s?s.aliasOf?s.aliasOf.path:s.path:""}const Lg=(s,a,t)=>null!=s?s:null!=a?a:t;function Rg(s,a){if(!s)return null;const t=s(a);return 1===t.length?t[0]:t}const Bg=Ka({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},setup(s,{attrs:a,slots:t}){const n=Ra(bu),e=Sa((()=>s.route||n.value)),l=Ra(ju,0),p=Sa((()=>e.value.matched[l]));La(ju,l+1),La(gu,p),La(bu,e);const c=qa(o);var o;return ve((()=>[c.value,p.value,s.name]),(([s,a,t],[n,e,l])=>{a&&(a.instances[t]=s,e&&e!==a&&s&&s===n&&(a.leaveGuards.size||(a.leaveGuards=e.leaveGuards),a.updateGuards.size||(a.updateGuards=e.updateGuards))),!s||!a||e&&Su(a,e)&&n||(a.enterCallbacks[t]||[]).forEach((a=>a(s)))}),{flush:"post"}),()=>{const n=e.value,l=p.value,o=l&&l.components[s.name],d=s.name;if(!o)return Rg(t.default,{Component:o,route:n});const r=l.props[s.name],i=r?!0===r?n.params:"function"==typeof r?r(n):r:null,h=xe(o,yu({},i,a,{onVnodeUnmounted:s=>{s.component.isUnmounted&&(l.instances[d]=null)},ref:c}));return Rg(t.default,{Component:h,route:n})||h}}});function Mg(s){const a=pg(s.routes,s);let t=s.parseQuery||Pg,n=s.stringifyQuery||Ig,e=s.history;const l=Eg(),p=Eg(),c=Eg(),o=qa(Gu,!0);let d=Gu;fu&&s.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const r=qu.bind(null,(s=>""+s)),i=qu.bind(null,Cg),h=qu.bind(null,zg);function u(s,l){if(l=yu({},l||o.value),"string"==typeof s){let n=_u(t,s,l.path),p=a.resolve({path:n.path},l),c=e.createHref(n.fullPath);return yu(n,p,{params:h(p.params),hash:zg(n.hash),redirectedFrom:void 0,href:c})}let p;"path"in s?p=yu({},s,{path:_u(t,s.path,l.path).path}):(p=yu({},s,{params:i(s.params)}),l.params=i(l.params));let c=a.resolve(p,l);const d=s.hash||"";c.params=r(h(c.params));const u=function(s,a){let t=a.query?s(a.query):"";return a.path+(t&&"?")+t+(a.hash||"")}(n,yu({},s,{hash:(g=d,kg(g).replace(qg,"{").replace(wg,"}").replace(fg,"^")),path:c.path}));var g;let j=e.createHref(u);return yu({fullPath:u,hash:d,query:n===Ig?Og(s.query):s.query},c,{redirectedFrom:void 0,href:j})}function g(s){return"string"==typeof s?_u(t,s,o.value.path):yu({},s)}function j(s,a){if(d!==s)return Xu(8,{from:a,to:s})}function m(s){return b(s)}function v(s){const a=s.matched[s.matched.length-1];if(a&&a.redirect){const{redirect:t}=a;let n="function"==typeof t?t(s):t;return"string"==typeof n&&(n=n.indexOf("?")>-1||n.indexOf("#")>-1?n=g(n):{path:n}),yu({query:s.query,hash:s.hash,params:s.params},n)}}function b(s,a){const t=d=u(s),e=o.value,l=s.state,p=s.force,c=!0===s.replace,r=v(t);if(r)return b(yu(g(r),{state:l,force:p,replace:c}),a||t);const i=t;let h;return i.redirectedFrom=a,!p&&function(s,a,t){let n=a.matched.length-1,e=t.matched.length-1;return n>-1&&n===e&&Su(a.matched[n],t.matched[e])&&Cu(a.params,t.params)&&s(a.query)===s(t.query)&&a.hash===t.hash}(n,e,t)&&(h=Xu(16,{to:i,from:e}),I(e,e,!0,!1)),(h?Promise.resolve(h):y(i,e)).catch((s=>Ju(s)?s:z(s))).then((s=>{if(s){if(Ju(s,2))return b(yu(g(s.to),{state:l,force:p,replace:c}),a||i)}else s=x(i,e,!0,c,l);return q(i,e,s),s}))}function f(s,a){const t=j(s,a);return t?Promise.reject(t):Promise.resolve()}function y(s,a){let t;const[n,e,c]=function(s,a){const t=[],n=[],e=[],l=Math.max(a.matched.length,s.matched.length);for(let p=0;pSu(s,l)))?n.push(l):t.push(l));const c=s.matched[p];c&&(a.matched.find((s=>Su(s,c)))||e.push(c))}return[t,n,e]}(s,a);t=Tg(n.reverse(),"beforeRouteLeave",s,a);for(const l of n)l.leaveGuards.forEach((n=>{t.push(Dg(n,s,a))}));const o=f.bind(null,s,a);return t.push(o),$g(t).then((()=>{t=[];for(const n of l.list())t.push(Dg(n,s,a));return t.push(o),$g(t)})).then((()=>{t=Tg(e,"beforeRouteUpdate",s,a);for(const n of e)n.updateGuards.forEach((n=>{t.push(Dg(n,s,a))}));return t.push(o),$g(t)})).then((()=>{t=[];for(const n of s.matched)if(n.beforeEnter&&a.matched.indexOf(n)<0)if(Array.isArray(n.beforeEnter))for(const e of n.beforeEnter)t.push(Dg(e,s,a));else t.push(Dg(n.beforeEnter,s,a));return t.push(o),$g(t)})).then((()=>(s.matched.forEach((s=>s.enterCallbacks={})),t=Tg(c,"beforeRouteEnter",s,a),t.push(o),$g(t)))).then((()=>{t=[];for(const n of p.list())t.push(Dg(n,s,a));return t.push(o),$g(t)})).catch((s=>Ju(s,8)?s:Promise.reject(s)))}function q(s,a,t){for(const n of c.list())n(s,a,t)}function x(s,a,t,n,l){const p=j(s,a);if(p)return p;const c=a===Gu,d=fu?history.state:{};t&&(n||c?e.replace(s.fullPath,yu({scroll:c&&d&&d.scroll},l)):e.push(s.fullPath,l)),o.value=s,I(s,a,t,c),P()}let w;function _(){w=e.listen(((s,a,t)=>{let n=u(s);const l=v(n);if(l)return void b(yu(l,{replace:!0}),n).catch(xu);d=n;const p=o.value;var c,r;fu&&(c=Ru(p.fullPath,t.delta),r=Fu(),Bu.set(c,r)),y(n,p).catch((s=>Ju(s,12)?s:Ju(s,2)?(b(s.to,n).catch(xu),Promise.reject()):(t.delta&&e.go(-t.delta,!1),z(s)))).then((s=>{(s=s||x(n,p,!1))&&t.delta&&e.go(-t.delta,!1),q(n,p,s)})).catch(xu)}))}let k,S=Eg(),C=Eg();function z(s){return P(s),C.list().forEach((a=>a(s))),Promise.reject(s)}function P(s){k||(k=!0,_(),S.list().forEach((([a,t])=>s?t(s):a())),S.reset())}function I(a,t,n,e){const{scrollBehavior:l}=s;if(!fu||!l)return Promise.resolve();let p=!n&&function(s){const a=Bu.get(s);return Bu.delete(s),a}(Ru(a.fullPath,0))||(e||!n)&&history.state&&history.state.scroll||null;return oe().then((()=>l(a,t,p))).then((s=>s&&Lu(s))).catch(z)}const O=s=>e.go(s);let E;const D=new Set;return{currentRoute:o,addRoute:function(s,t){let n,e;return Wu(s)?(n=a.getRecordMatcher(s),e=t):e=s,a.addRoute(e,n)},removeRoute:function(s){let t=a.getRecordMatcher(s);t&&a.removeRoute(t)},hasRoute:function(s){return!!a.getRecordMatcher(s)},getRoutes:function(){return a.getRoutes().map((s=>s.record))},resolve:u,options:s,push:m,replace:function(s){return m(yu(g(s),{replace:!0}))},go:O,back:()=>O(-1),forward:()=>O(1),beforeEach:l.add,beforeResolve:p.add,afterEach:c.add,onError:C.add,isReady:function(){return k&&o.value!==Gu?Promise.resolve():new Promise(((s,a)=>{S.add([s,a])}))},install(s){s.component("RouterLink",Ng),s.component("RouterView",Bg),s.config.globalProperties.$router=this,Object.defineProperty(s.config.globalProperties,"$route",{get:()=>xa(o)}),fu&&!E&&o.value===Gu&&(E=!0,m(e.location).catch((s=>{})));const a={};for(let n in Gu)a[n]=Sa((()=>o.value[n]));s.provide(mu,this),s.provide(vu,oa(a)),s.provide(bu,o);let t=s.unmount;D.add(s),s.unmount=function(){D.delete(s),D.size<1&&(w(),o.value=Gu,E=!1,k=!1),t()}}}}function $g(s){return s.reduce(((s,a)=>s.then((()=>a()))),Promise.resolve())}const Ug=navigator.userAgent.toLowerCase(),Vg=/ios|iphone|ipod|ipad|android/.test(Ug);function Hg(s,a="-"){return s.replace(/([a-z\d])([A-Z])/g,"$1"+a+"$2").replace(/([A-Z]+)([A-Z][a-z\d]+)/g,"$1"+a+"$2").toLowerCase()}let Wg=[],Gg=!1;function Kg(){var s,a;const t=window.vueRouter,{path:n}=t.currentRoute.value;return(null==(s=Th.site.simulator)?void 0:s.routeMapper)?null==(a=Th.site.simulator)?void 0:a.routeMapper(n):n}function Qg(){window.top.postMessage({type:"replacePath",value:Kg()},"*")}function Yg(){const s=document.querySelector("iframe");var a;s&&(a=()=>{s.contentWindow.postMessage({type:"replacePath",value:Kg()},"*")},Gg?a():Wg.push(a))}function Xg(s){window.addEventListener("message",(a=>{var t,n;if("replacePath"!==(null==(t=a.data)?void 0:t.type))return;const e=(null==(n=a.data)?void 0:n.value)||"";s.currentRoute.value.path!==e&&s.replace(e).catch((()=>{}))}))}window.top===window?window.addEventListener("message",(s=>{"iframeReady"===s.data.type&&(Gg=!0,Wg.forEach((s=>s())),Wg=[])})):window.top.postMessage({type:"iframeReady"},"*"),Vg&&location.replace("mobile.html"+location.hash);const{locales:Jg,defaultLang:Zg}=Th.site;function sj(s){const a=s.path.split("/")[1];return-1!==Object.keys(Jg).indexOf(a)?a:au()}tu(Zg);const aj=Mg({history:Hu(),routes:function(){const s=[],a=Object.keys(Ah);return Jg?s.push({name:"notFound",path:"/:path(.*)+",redirect:s=>({name:sj(s)})}):s.push({name:"notFound",path:"/:path(.*)+",redirect:{name:"home"}}),a.forEach((a=>{const{component:t,lang:n}=function(s){if(-1!==s.indexOf("_")){const a=s.split("_");return{component:`${Hg(a.shift())}`,lang:a.join("-")}}return{component:`${Hg(s)}`,lang:""}}(a);"home"===t&&function(a,t){s.push({name:t||"home",path:`/${t||""}`,component:a,meta:{lang:t}})}(Ah[a],n),n?s.push({name:`${n}/${t}`,path:`/${n}/${t}`,component:Ah[a],meta:{lang:n,name:t}}):s.push({name:`${t}`,path:`/${t}`,component:Ah[a],meta:{name:t}})})),s}(),scrollBehavior:s=>s.hash?{el:s.hash}:{x:0,y:0}});aj.afterEach((()=>{oe(Yg)})),!1!==(null==(s=Th.site.simulator)?void 0:s.syncPathFromSimulator)&&Xg(aj),window.vueRouter=aj,window.app=nl(eu).use(aj).component(iu.name,iu),setTimeout((()=>{window.app.mount("#app")}),0);const tj={name:"DemoBlock",props:{card:Boolean,title:String}},nj={class:"van-doc-demo-block"},ej={key:0,class:"van-doc-demo-block__title"},lj={key:1,class:"van-doc-demo-block__card"};var pj=el(tj,[["render",function(s,a,t,n,e,l){return cn(),hn("div",nj,[t.title?(cn(),hn("h2",ej,j(t.title),1)):_n("v-if",!0),t.card?(cn(),hn("div",lj,[Pn(s.$slots,"default")])):Pn(s.$slots,"default",{key:2})])}]]);var cj=el({name:"DemoSection",computed:{demoName(){const{meta:s}=this.$route||{};return s&&s.name?`demo-${Hg(s.name)}`:""}}},[["render",function(s,a,t,n,e,l){return cn(),hn("section",{class:g(["van-doc-demo-section",l.demoName])},[Pn(s.$slots,"default")],2)}]]);const oj={},dj={versions:[{label:"0.x",link:"/vant-weapp/0.x"}],title:"Vant Weapp",description:"轻量、可靠的小程序 UI 组件库",logo:"https://img.yzcdn.cn/vant/logo.png",simulator:{url:"https://vant-contrib.gitee.io/vant/mobile.html?weapp=1",syncPathFromSimulator:!1},links:[{logo:"https://img.yzcdn.cn/vant/vant-o.svg",url:"https://vant-contrib.gitee.io/vant/"},{logo:"https://b.yzcdn.cn/vant/logo/github.svg",url:"https://github.com/youzan/vant-weapp"}],baiduAnalytics:{seed:"ad6b5732c36321f2dafed737ac2da92f"},nav:[]},rj={},ij={viewBox:"0 0 1024 1024"},hj=[fn("path",{fill:"#B6C3D2",d:"M601.1 556.5L333.8 289.3c-24.5-24.5-24.5-64.6 0-89.1s64.6-24.5 89.1 0l267.3 267.3c24.5 24.5 24.5 64.6 0 89.1-24.5 24.4-64.6 24.4-89.1-.1z"},null,-1),fn("path",{fill:"#B6C3D2",d:"M690.2 556.5L422.9 823.8c-24.5 24.5-64.6 24.5-89.1 0s-24.5-64.6 0-89.1l267.3-267.3c24.5-24.5 64.6-24.5 89.1 0 24.5 24.6 24.5 64.6 0 89.1z"},null,-1)];const uj={class:"demo-home-nav"},gj={class:"demo-home-nav__title"},jj={class:"demo-home-nav__group"};const mj={class:"demo-home"},vj=["src"],bj={key:0,class:"demo-home__desc"};var fj=el({components:{DemoHomeNav:el({components:{ArrowRight:el(rj,[["render",function(s,a){return cn(),hn("svg",ij,hj)}]])},props:{lang:String,group:Object},data:()=>({active:[]}),computed:{base(){return this.lang?`/${this.lang}`:""}}},[["render",function(s,a,t,n,e,l){const p=Xt("arrow-right"),c=Xt("router-link");return cn(),hn("div",uj,[fn("div",gj,j(t.group.title),1),fn("div",jj,[(cn(!0),hn(an,null,zn(t.group.items,(s=>(cn(),un(c,{class:"demo-home-nav__block",key:s.path,to:`${l.base}/${s.path}`},{default:Da((()=>[xn(j(s.title)+" ",1),yn(p,{class:"demo-home-nav__icon"})])),_:2},1032,["to"])))),128))])])}]])},computed:{lang(){const{lang:s}=this.$route.meta;return s},config(){const{locales:s}=dj;return s?s[this.lang]:dj},smallTitle(){return this.config.title.length>=8}}},[["render",function(s,a,t,n,e,l){const p=Xt("demo-home-nav");return cn(),hn("div",mj,[fn("h1",{class:g(["demo-home__title",{"demo-home__title--small":l.smallTitle}])},[fn("img",{src:l.config.logo},null,8,vj),fn("span",null,j(l.config.title),1)],2),l.config.description?(cn(),hn("h2",bj,j(l.config.description),1)):_n("v-if",!0),(cn(!0),hn(an,null,zn(l.config.nav,((s,a)=>(cn(),un(p,{key:a,lang:l.lang,group:s},null,8,["lang","group"])))),128))])}]]);const{locales:yj,defaultLang:qj}=dj;function xj(s){const a=s.path.split("/")[1];return-1!==Object.keys(yj).indexOf(a)?a:au()}tu(qj);const wj=Mg({history:Hu(),routes:function(){const s=[],a=Object.keys(oj),t=yj?Object.keys(yj):[];return t.length?(s.push({name:"NotFound",path:"/:path(.*)+",redirect:s=>({name:xj(s)})}),t.forEach((a=>{s.push({name:a,path:`/${a}`,component:fj,meta:{lang:a}})}))):(s.push({name:"NotFound",path:"/:path(.*)+",redirect:{name:"home"}}),s.push({name:"home",path:"/",component:fj})),a.forEach((a=>{const n=Hg(a);t.length?t.forEach((t=>{s.push({name:`${t}/${n}`,path:`/${t}/${n}`,component:oj[a],meta:{name:a,lang:t}})})):s.push({name:n,path:`/${n}`,component:oj[a],meta:{name:a}})})),s}(),scrollBehavior:(s,a,t)=>t||{x:0,y:0}});ve(wj.currentRoute,(()=>{wj.currentRoute.value.redirectedFrom||oe(Qg)})),Xg(wj),window.vueRouter=wj;const _j={class:"demo-nav"},kj={class:"demo-nav__title"},Sj=["d"];var Cj=el({components:{DemoNav:el({data:()=>({path:"M296.114 508.035c-3.22-13.597.473-28.499 11.079-39.105l333.912-333.912c16.271-16.272 42.653-16.272 58.925 0s16.272 42.654 0 58.926L395.504 498.47l304.574 304.574c16.272 16.272 16.272 42.654 0 58.926s-42.654 16.272-58.926 0L307.241 528.058a41.472 41.472 0 0 1-11.127-20.023z"}),computed:{title(){const{name:s}=this.$route.meta||{};return s?s.replace(/-/g,""):""}},methods:{onBack(){history.length>1?history.back():this.$router.replace("/")}}},[["render",function(s,a,t,n,e,l){return Mt((cn(),hn("div",_j,[fn("div",kj,j(l.title),1),(cn(),hn("svg",{class:"demo-nav__back",viewBox:"0 0 1000 1000",onClick:a[0]||(a[0]=(...s)=>l.onBack&&l.onBack(...s))},[fn("path",{fill:"#969799","fill-rule":"evenodd",d:e.path},null,8,Sj)]))],512)),[[Ze,l.title]])}]])}},[["render",function(s,a,t,n,e,l){const p=Xt("demo-nav"),c=Xt("demo-section"),o=Xt("router-view");return cn(),hn(an,null,[yn(p),yn(o,null,{default:Da((({Component:s})=>[(cn(),un(Xa,null,[yn(c,null,{default:Da((()=>{return[(cn(),un((a=s,E(a)?Zt("components",a,!1)||a:a||Jt)))];var a})),_:2},1024)],1024))])),_:1})],64)}]]);!function(){if("undefined"!=typeof window){var s,a="ontouchstart"in window;document.createTouch||(document.createTouch=function(s,a,n,e,l,p,c){return new t(a,n,{pageX:e,pageY:l,screenX:p,screenY:c,clientX:e-window.pageXOffset,clientY:l-window.pageYOffset},0,0)}),document.createTouchList||(document.createTouchList=function(){for(var s=e(),a=0;a{window.app.mount("#app")}),0); diff --git a/vite/assets/nested.69dfa8e2.js b/vite/assets/nested.69dfa8e2.js new file mode 100644 index 00000000..70d6d4f6 --- /dev/null +++ b/vite/assets/nested.69dfa8e2.js @@ -0,0 +1 @@ +import"./main.5e9c7f08.js"; diff --git a/vite/index.html b/vite/index.html index 61e7e862..61f53d87 100644 --- a/vite/index.html +++ b/vite/index.html @@ -24,8 +24,8 @@ })(); - - + +
diff --git a/vite/mobile.html b/vite/mobile.html index 855ed350..c0870d1a 100644 --- a/vite/mobile.html +++ b/vite/mobile.html @@ -26,9 +26,9 @@ } - - - + + +