精华内容
下载资源
问答
  • 2020-07-12 21:55:55

    ctrl + click 跳转到定义
    alt + <- -> 回去或前进

    折叠代码

    F12 跳转到定义处
    alt + f12 peek 定义处
    shift + f12 展示相关

    更多相关内容
  • Vant地址 运行 git clone git@github.com:youzan/vant-weapp.git cd vant-weapp && npm install npm run dev 接着打开微信开发者工具,导入example目录的项目就可以预览示例了。 注:可直接在根目录下...

    官网地址

    Vant地址

    运行

    git clone git@github.com:youzan/vant-weapp.git
    

    cd vant-weapp && npm install
    

    npm run dev
    

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

    注:可直接在根目录下新建page文件夹进行开发,组件可以直接在任何地方引用。

    展开全文
  • Vant-list源码详解

    千次阅读 2018-10-11 12:46:41
    一、源码理解基础之scroll.js 1、1 &gt;&gt;&gt; getScrollEventTarget export default { getScrollEventTarget(element, rootParent = window) { let currentNode = element; while (currentNode...

    一、源码理解基础之scroll.js

    1、1 >>> getScrollEventTarget

    export default {
    getScrollEventTarget(element, rootParent = window) {
        let currentNode = element;
        while (currentNode && currentNode.tagName !== 'HTML' && currentNode.tagName !== 'BODY' && currentNode.nodeType === 1 && currentNode !== rootParent) {
          const overflowY = this.getComputedStyle(currentNode).overflowY;
          if (overflowY === 'scroll' || overflowY === 'auto') {
            return currentNode;
          }
          currentNode = currentNode.parentNode;
        }
        return rootParent;
      }
    }
    

    getScrollEventTarget:

    这个函数用于找到“目标容器”,即:有滚动条的dom。

     

    1、2>>>  getScrollTop

     getScrollTop(element) {
        return 'scrollTop' in element ? element.scrollTop : element.pageYOffset;
      }

    getScrollTop:

    获取元素的滚动条高度。

    Element.scrollTop 属性可以获取或设置一个元素的内容垂直滚动的像素数。

    一个元素的 scrollTop 值是这个元素的顶部到它的最顶部可见内容(的顶部)的距离的度量。当一个元素的内容没有产生垂直方向的滚动条,那么它的 scrollTop 值为0。

     

    1、3>>> getElementTop

     getElementTop(element) {
        return (element === window ? 0 : element.getBoundingClientRect().top) + this.getScrollTop(window);
      },

    getElementTop:

    元素顶部至页面顶部的距离

    getBoundingClientRect用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。

     

    1、4>>>  getVisibleHeight

      getVisibleHeight(element) {
        return element === window ? element.innerHeight : element.getBoundingClientRect().height;
      },

    getVisibleHeight:

    获取元素高度

     

    二、源码理解之index.vue

    重要源码部分

      methods: {
        check() {
          if (this.loading || this.finished) {
            return;
          }
    
          const el = this.$el;
          const { scroller } = this;
          // scrollerHeight 容器可见高度
          const scrollerHeight = utils.getVisibleHeight(scroller);
    
          /* istanbul ignore next */
          if (!scrollerHeight || utils.getComputedStyle(el).display === 'none' || el.offsetParent === null) {
            return;
          }
          // scrollTop滚动高度
          const scrollTop = utils.getScrollTop(scroller);
          const targetBottom = scrollTop + scrollerHeight;
          let reachBottom = false;
          /* istanbul ignore next */
          if (el === scroller) {
            reachBottom = scroller.scrollHeight - targetBottom < this.offset;
          } else {
            const elBottom =
              utils.getElementTop(el) -
              utils.getElementTop(scroller) +
              utils.getVisibleHeight(el);
            reachBottom = elBottom - scrollerHeight < this.offset;
          }
    
          /* istanbul ignore else */
          if (reachBottom) {
            this.$emit('input', true);
            this.$emit('load');
          }
        },
    
        handler(bind) {
          /* istanbul ignore else */
          if (this.binded !== bind) {
            this.binded = bind;
            (bind ? on : off)(this.scroller, 'scroll', this.check);
          }
        }
      }

    最主要的方法是check()

    重中之重是这段代码:

    const elBottom =
              utils.getElementTop(el) -
              utils.getElementTop(scroller) +
              utils.getVisibleHeight(el);
            reachBottom = elBottom - scrollerHeight < this.offset;

    下面我就来解释下这段代码的意思:

     看图一:

    图一
    图一

     这里用a来表示utils.getElementTop(el)    a=152   代表dom顶部距离page顶部的距离

    b表示utils.getVisibleHeight(el)  b=800   代表dom的高度

    d表示utils.getElementTop(scroller) 即滚动条的滚动的高度,此时没有滚动,即d=0

    c表示scrollerHeight  即整个容器的高度

    this.offset可以自定义设定

    再来看图二:

    图二

     

    此时滚动条向下滚动了50

    所以现在来看下

    a=152

    b=800

    c=852

    d=50

    此时有变化的是utils.getElementTop(scroller)

    如果我们设定this.offset=10

     reachBottom = elBottom - scrollerHeight < this.offset

                          =a-d+b-c=152-50+800-852=50 < 10

    所以 reachBottom=false

    所以 reachBottom还未达到触发滚动至底部加载新内容的条件

     

    如果我们设定this.offset=55

    reachBottom = 50 < 55 = true

    所以此时可以触发加载新内容。

     

    具体代码可以查看https://github.com/youzan/vant/tree/dev/packages/listhttps://github.com/youzan/vant/tree/dev/packages/utils

    展开全文
  • vant源码分析--checkbox组件

    千次阅读 2020-03-16 22:40:57
    本人最近也只是在瞎琢磨vant源码。 本文的思想来源于这里可以跳转的一篇文章。有很多东西借鉴了这里的想法,也是这篇文章的一个延伸吧。 组件目录结构 src └─ button ├─ demo # 示例代码 ├─ test # 单元测试...

    这篇文章就是看看一个ui compent是怎么建造出来的,vant的拆分写法写的如何优秀。本人最近也只是在瞎琢磨vant源码。

    本文的思想来源于这里可以跳转的一篇文章。有很多东西借鉴了这里的想法,也是这篇文章的一个延伸吧。

    组件目录结构

    src
    └─ button
       ├─ demo             # 示例代码
       ├─ test             # 单元测试
       ├─ index.js         # 组件入口
       ├─ index.less       # 组件样式
       ├─ README.md        # 英文文档
       └─ README.zh-CN.md  # 中文文档
    

    vant的轮子

    在vant源码中,utils中封装了很多工具和方法。涉及了ts,tsx,js,vue等技术栈。

    每个组件在一开是都会调用createNamespace函数,它接收参数(name),返回createComponent, createBEM, createI18N三个函数。即comonent实例,css帮助类函数,以及多语言工具。

    import { createBEM, BEM } from './bem';
    import { createComponent } from './component';
    import { createI18N, Translate } from './i18n';
    
    type CreateNamespaceReturn = [
      ReturnType<typeof createComponent>,
      BEM,
      Translate
    ];
    
    export function createNamespace(name: string): CreateNamespaceReturn {
      name = 'van-' + name;
      return [createComponent(name), createBEM(name), createI18N(name)];
    }
    

    1. createComponent

    createComponent方法根据参数name,创建一个vue组件。

    export function createComponent(name: string) {
     return function<Props = DefaultProps, Events = {}, Slots = {}>(
     	// sfc参数是调用createComponent参数时传的值 支持两种格式,对象式组件或者函数式组件
       sfc: VantComponentOptions | FunctionComponent
     ): TsxComponent<Props, Events, Slots> {
       if (isFunction(sfc)) {  // 这里判断是否是函数式组件,如是转换为对象式组件
         sfc = transformFunctionComponent(sfc);
       }
    
       if (!sfc.functional) {
       	//mixins是vue自带的,算是一种组件可复用的一些功能组合。
       	// 当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。
         sfc.mixins = sfc.mixins || [];
         //  push了一个兼容低版本scopedSlots的mixin
         sfc.mixins.push(SlotsMixin);
       }
    
       sfc.name = name;
       // install中调用了vue.compoent注册组件的方法
       sfc.install = install;
    
       return sfc as TsxComponent<Props, Events, Slots>;
     };
    }
    

    2. createBEM

    createBEM函数接收name参数生成符合BEM规范的class

    export function createBEM(name: string) {
     return function(el?: Mods, mods?: Mods): Mods {
       if (el && typeof el !== 'string') {  // 判断el参数是否存在并不是string类型
         mods = el;
         el = '';
       }
       el = join(name, el, ELEMENT); // join方法返回类似checkbox__text的类名
    
       return mods ? [el, prefix(el, mods)] : el;  
     };
    }
    

    最后返回类似BEM格式的class类名

    /**
     * bem helper
     * b() // 'button'
     * b('text') // 'button__text'
     * b({ disabled }) // 'button button--disabled'
     * b('text', { disabled }) // 'button__text button__text--disabled'
     * b(['disabled', 'primary']) // 'button button--disabled button--primary'
     */
    
    

    3. createI18N

    多种语言处理

    import { get, isFunction } from '..';
    import { camelize } from '../format/string';
    import locale from '../../locale';
    
    export function createI18N(name: string) {
     const prefix = camelize(name) + '.';
    
     return function(path: string, ...args: any[]): string {
       const messages = locale.messages();
       const message = get(messages, prefix + path) || get(messages, path);
    
       return isFunction(message) ? message(...args) : message;
     };
    }
    
    export type Translate = ReturnType<typeof createI18N>;
    
    

    van组件checkbox

    van组件checkbox的具体配置

    首先引入createNamespace函数和mixin组件可复用功能。并调用createNamespace函数

    import { createNamespace } from '../utils';
    import { CheckboxMixin } from '../mixins/checkbox';
    
    const [createComponent, bem] = createNamespace('checkbox');  // 这里是来接收createNamespace函数返回的方法
    

    接下来是引入checkbox组件的配置

    // 调用createComponent方法并返回这个方法的具体结果
    export default createComponent({
      // mixins组件可复用的一些功能和方法
      // 这里具体引入了一些props、computed、methods还有rander函数
      mixins: [
        CheckboxMixin({
          bem,
          role: 'checkbox',
          parent: 'vanCheckbox',
        }),
      ],
      // checked计算属性用来完成checkbox的v-model双向绑定的原理
      computed: {
        checked: {
          get() {
            if (this.parent) {
              return this.parent.value.indexOf(this.name) !== -1;
            }
            return this.value;
          },
    
          set(val) {
            if (this.parent) {
              this.setParentValue(val);
            } else {
              this.$emit('input', val);
            }
          },
        },
      },
      // 监听value属性,只要发生改变,就会向父组件发出通知
      watch: {
        value(val) {
          this.$emit('change', val);
        },
      },
      // methods用来组件提供的方法
      methods: {
        // @exposed-api
        // toggle的具体用法参见官网api
        toggle(checked = !this.checked) {
          // When toggle method is called multiple times at the same time,
          // only the last call is valid.
          // This is a hack for usage inside Cell.
          clearTimeout(this.toggleTask);
          this.toggleTask = setTimeout(() => {
            this.checked = checked;
          });
        },
    
        setParentValue(val) {
          const { parent } = this;
          const value = parent.value.slice();
    
          if (val) {
            if (parent.max && value.length >= parent.max) {
              return;
            }
    
            /* istanbul ignore else */
            if (value.indexOf(this.name) === -1) {
              value.push(this.name);
              parent.$emit('input', value);
            }
          } else {
            const index = value.indexOf(this.name);
    
            /* istanbul ignore else */
            if (index !== -1) {
              value.splice(index, 1);
              parent.$emit('input', value);
            }
          }
        },
      },
    });
    
    
    展开全文
  • vantweapp源代码

    2022-01-25 18:01:53
    vantweapp源代码
  • 基于vant, vue, axios, vuex的移动端项目, 仿小米商场移动端项目软件源码,较为简单的基于vant, vue, axios, vuex的移动端项目, 仿小米商场移动端项目, 有基本的页面和假数据, 适合作为电商项目的启动模板或者用作...
  • Vant 是一套轻量、可靠的移动端组件库。通过 Vant,可以快速搭建出风格统一的页面,提升开发效率。 特性: 1、60+ 高质量组件 2、95% 单元测试覆盖率 3、完善的中英文文档和示例 4、支持按需引入 5、支持主题定制 6...
  • vue-vant

    2021-03-29 16:50:45
    Vue + VueX + Vant + Axios + Node.js + Expresss + MySQL 版本管理 自动化部署工具git +码云Gitee 业务功能 静态链接采用Restful原则设计,方便统一请求业务功能接口文件按功能划分,方便阅读维护服务器端口3000...
  • vant 上拉加载 下拉刷新实际案例源码模板。你可以用请求的数据放到模板里面可以直接使用,不需要改啥,只需要复制,粘贴 就 o j b k 了。
  • 今天这篇文章将会带着你解析这一系列疑问,以vant-weapp组件库为例,从开发标准的弹窗组件使用到高度定制复合自我审美的弹窗,再到完全研究清楚vant-weapp框架弹窗组件部分源码。 一、vant-weapp弹窗组件介绍 vant-...
  • 基于Vue3.x和Vant4.x模仿bilibili小程序源码.zip
  • vant-demo.zip

    2020-03-27 16:33:02
    vue vant 实现原生H5 APP混合开发,原生APP 接口实现 移动端H5,微信公众号,IOS,安卓
  • 基于vant ui的移动端商城项目 构建设置 # install dependencies npm install # serve with hot reload at localhost:8080 npm run dev # build for production with minification npm run build # build for ...
  • Vant 是一套轻量、可靠的移动端组件库。通过 Vant,可以快速搭建出风格统一的页面,提升开发效率。
  • api接口采用技术:Vue(前端框架) + Vant(前端轻量级ui库) + SSM框架,可以升级Springboot 基于Vue图书管理app技术要点: 1 此系统web端接口采用java语言和ssm框架实现,可以升级Springboot 2 客户端和服务器通信...
  • 有赞vant-ui源码H5+后台php开源代码,UI漂亮,最新的淘客Api集成,配置简单,前端源码非编译后的源码
  • 1.查看Vant官网https://youzan.github.io/vant/#/zh-CN/datetime-picker 引入Vant中DatetimePicker组件(全局引入后可直接使用) import Vue from 'vue'; import { DatetimePicker } from 'vant' Vue.use...
  • 因为vue项目里的node_...多人会设置此文件夹排除再idea/webstorm索引之外,这就是点不进第三方组件源码的原因 解决办法: 进入node_modules目录下,找到第三方组件的依赖,把组件加入idea/webstorm 索引 ...
  • VantUI Uniapp 示例 本示例原本是从vant官方发布的微信演示示例转换而来,支持微信小程序(H5不支持!!)。 vant-weapp版本为1.6.7. vant weapp的组件库,都在工程的wxcomponents目录下。pages目录下是各个示例页面...
  • 之前用过很多插件做这个功能,但是效果都不尽人意,出现各种问题,直到遇到vant这个插件,完美的解决了这些小问题,如有问题,欢迎联系我 安装依赖 npm i vant -S 在main.js中引入 import Vant from 'vant'; ...
  • 基于Vite、uniapp和vantweapp的微信游戏商城小程序源码.zip
  • 首先先给上官网...有点像,可又有点不像,哈哈哈,那我们一起看看源码把官网的例子改为自己想要的样子。 首先是wxml文件那里,有定义好的title和price等等,我们照他们的写法,添...
  • vant官网中找不到关于area省市区选择的数据源,所以我这边整理成 json格式,以便下载使用。
  • vant源码分析--col、row组件

    千次阅读 2020-03-17 14:15:28
    vant中col和row组件能完成layout布局,来进行行列布局。 row组件目录结构 src └─ row ├─ index.js # 组件入口 ├─ index.less # 组件样式 index.js组件入口 还是引入createNamespace函数并调用,...
  • Vant Mobile UI Components built on Vue 文档网站(国内) 文档网站(GitHub) 中文版介绍 Features 1KB Component average size (min+gzip) 70+ High quality components 90%+ ...
  • api接口采用技术:Vue(前端框架) + Vant(前端轻量级ui库) + SSM框架,可以升级Springboot 基于Vue图书管理app技术要点: 1 此系统web端接口采用java语言和ssm框架实现,可以升级Springboot 2 客户端和服务器通信...
  • vite-vant-v3

    2021-05-12 09:57:53
    vite-vant-v3 pull git clone https://github.com/frontend-qin/vite-vant-v3.git install yarn 脚本 # 启动本地服务接口 yarn dev # 启动测试服务接口 yarn test # 启动正式服务接口 yarn prod # 打包:本地开发...
  • import {Card,button,Toast,AddressList,Popup,AddressEdit,Area} from 'vant' 主要是配货地址编辑这块; <van-address-edit :area-list="areaList" :address-info="addressInfo" show-postal show-delete ...
  • 主要给大家介绍了关于微信小程序使用Vant Weapp组件库的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用微信小程序具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 业务背景用了uni-app一年啦,但是没有通用的ui框架,就想着自己仿vant-weapp,适配一下uni-app,能够在各个端上用这两天把button仿下来,但是里面有几个地方还存在疑问,关于css为什么要使用新的css变量?在package/common/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,090
精华内容 836
关键字:

如何查看vant源码

友情链接: audacity-2.4.2.zip