zoukankan      html  css  js  c++  java
  • Vue.use做了什么,以element-ui为例简要说明

    Vue.use做了什么

    我们在使用vue+element-ui做前端开发时经常会在工程的main.js里面写上如下几句代码(注:多余的代码已忽略)

    import Vue from 'vue'
    import Element from 'element-ui'
    ...
    Vue.use(Element, {
      size: Cookies.get('size') || 'medium' // set element-ui default size
      // locale: enLang // 如果使用中文,无需设置,请删除
    })
    

    通过以上代码设定之后我们便可以在各个vue页面中任意使用element-ui的组件了,这中间到底发生了什么事情呢
    Vue.use方法内部代码大致如下(多余部分已经省略)

    // 这里的plugin参数就是,就是我们通过Vue.use(Element)引入的
    Vue.use = function (plugin: Function | Object) {
        
    	// ......
    	
    	const args = toArray(arguments, 1)
    	// 这一句很重要,这里的this,就是Vue,把他添加到args数组的第一个元素
    	args.unshift(this)
    	// 判断我们传递进来的"Element",也即这里的"plugin"内部是否有一个叫"install"的方法
    	// 如果有,就执行我们的"Element",也即"plugin.install"方法
        if (typeof plugin.install === 'function') {
          plugin.install.apply(plugin, args)
        } else if (typeof plugin === 'function') {
          plugin.apply(null, args)
        }
    	
    	// ......
    }
    

    也就是说Vue.use内部会执行第一个参数的install方法,那么我们看下 element-ui内部怎么写的

    import Pagination from '../packages/pagination/index.js';
    import Dialog from '../packages/dialog/index.js';
    import Autocomplete from '../packages/autocomplete/index.js';
    import Dropdown from '../packages/dropdown/index.js';
    import DropdownMenu from '../packages/dropdown-menu/index.js';
    import DropdownItem from '../packages/dropdown-item/index.js';
    import Menu from '../packages/menu/index.js';
    import Submenu from '../packages/submenu/index.js';
    import MenuItem from '../packages/menu-item/index.js';
    import MenuItemGroup from '../packages/menu-item-group/index.js';
    import Input from '../packages/input/index.js';
    import InputNumber from '../packages/input-number/index.js';
    import Radio from '../packages/radio/index.js';
    import RadioGroup from '../packages/radio-group/index.js';
    import RadioButton from '../packages/radio-button/index.js';
    import Checkbox from '../packages/checkbox/index.js';
    import CheckboxButton from '../packages/checkbox-button/index.js';
    import CheckboxGroup from '../packages/checkbox-group/index.js';
    import Switch from '../packages/switch/index.js';
    import Select from '../packages/select/index.js';
    import Option from '../packages/option/index.js';
    import OptionGroup from '../packages/option-group/index.js';
    import Button from '../packages/button/index.js';
    import ButtonGroup from '../packages/button-group/index.js';
    import Table from '../packages/table/index.js';
    import TableColumn from '../packages/table-column/index.js';
    import DatePicker from '../packages/date-picker/index.js';
    import TimeSelect from '../packages/time-select/index.js';
    import TimePicker from '../packages/time-picker/index.js';
    import Popover from '../packages/popover/index.js';
    import Tooltip from '../packages/tooltip/index.js';
    import MessageBox from '../packages/message-box/index.js';
    import Breadcrumb from '../packages/breadcrumb/index.js';
    import BreadcrumbItem from '../packages/breadcrumb-item/index.js';
    import Form from '../packages/form/index.js';
    import FormItem from '../packages/form-item/index.js';
    import Tabs from '../packages/tabs/index.js';
    import TabPane from '../packages/tab-pane/index.js';
    import Tag from '../packages/tag/index.js';
    import Tree from '../packages/tree/index.js';
    import Alert from '../packages/alert/index.js';
    import Notification from '../packages/notification/index.js';
    import Slider from '../packages/slider/index.js';
    import Loading from '../packages/loading/index.js';
    import Icon from '../packages/icon/index.js';
    import Row from '../packages/row/index.js';
    import Col from '../packages/col/index.js';
    import Upload from '../packages/upload/index.js';
    import Progress from '../packages/progress/index.js';
    import Spinner from '../packages/spinner/index.js';
    import Message from '../packages/message/index.js';
    import Badge from '../packages/badge/index.js';
    import Card from '../packages/card/index.js';
    import Rate from '../packages/rate/index.js';
    import Steps from '../packages/steps/index.js';
    import Step from '../packages/step/index.js';
    import Carousel from '../packages/carousel/index.js';
    import Scrollbar from '../packages/scrollbar/index.js';
    import CarouselItem from '../packages/carousel-item/index.js';
    import Collapse from '../packages/collapse/index.js';
    import CollapseItem from '../packages/collapse-item/index.js';
    import Cascader from '../packages/cascader/index.js';
    import ColorPicker from '../packages/color-picker/index.js';
    import Transfer from '../packages/transfer/index.js';
    import Container from '../packages/container/index.js';
    import Header from '../packages/header/index.js';
    import Aside from '../packages/aside/index.js';
    import Main from '../packages/main/index.js';
    import Footer from '../packages/footer/index.js';
    import Timeline from '../packages/timeline/index.js';
    import TimelineItem from '../packages/timeline-item/index.js';
    import Link from '../packages/link/index.js';
    import Divider from '../packages/divider/index.js';
    import Image from '../packages/image/index.js';
    import Calendar from '../packages/calendar/index.js';
    import Backtop from '../packages/backtop/index.js';
    import InfiniteScroll from '../packages/infinite-scroll/index.js';
    import PageHeader from '../packages/page-header/index.js';
    import CascaderPanel from '../packages/cascader-panel/index.js';
    import Avatar from '../packages/avatar/index.js';
    import Drawer from '../packages/drawer/index.js';
    import Popconfirm from '../packages/popconfirm/index.js';
    import locale from 'element-ui/src/locale';
    import CollapseTransition from 'element-ui/src/transitions/collapse-transition';
    
    //定义一个组件数组,存放element-ui开放出来的所有组件
    const components = [
      Pagination,
      Dialog,
      Autocomplete,
      Dropdown,
      DropdownMenu,
      DropdownItem,
      Menu,
      Submenu,
      MenuItem,
      MenuItemGroup,
      Input,
      InputNumber,
      Radio,
      RadioGroup,
      RadioButton,
      Checkbox,
      CheckboxButton,
      CheckboxGroup,
      Switch,
      Select,
      Option,
      OptionGroup,
      Button,
      ButtonGroup,
      Table,
      TableColumn,
      DatePicker,
      TimeSelect,
      TimePicker,
      Popover,
      Tooltip,
      Breadcrumb,
      BreadcrumbItem,
      Form,
      FormItem,
      Tabs,
      TabPane,
      Tag,
      Tree,
      Alert,
      Slider,
      Icon,
      Row,
      Col,
      Upload,
      Progress,
      Spinner,
      Badge,
      Card,
      Rate,
      Steps,
      Step,
      Carousel,
      Scrollbar,
      CarouselItem,
      Collapse,
      CollapseItem,
      Cascader,
      ColorPicker,
      Transfer,
      Container,
      Header,
      Aside,
      Main,
      Footer,
      Timeline,
      TimelineItem,
      Link,
      Divider,
      Image,
      Calendar,
      Backtop,
      PageHeader,
      CascaderPanel,
      Avatar,
      Drawer,
      Popconfirm,
      CollapseTransition
    ];
    
    //定义install方法,其中第一个参数就是Vue对象 也就是Vue.use内部调用install时传入的args数组的第一个参数Vue
    const install = function(Vue, opts = {}) {
      locale.use(opts.locale);
      locale.i18n(opts.i18n);
      //这句很重要,循环element-ui的组件数组并调用Vue.component方法进行全局组件注册,全局注册之后所有页面都可以使用了
      components.forEach(component => {
        //全局注册
        Vue.component(component.name, component);
      });
    
      Vue.use(InfiniteScroll);
      Vue.use(Loading.directive);
    
      Vue.prototype.$ELEMENT = {
        size: opts.size || '',
        zIndex: opts.zIndex || 2000
      };
    
      Vue.prototype.$loading = Loading.service;
      Vue.prototype.$msgbox = MessageBox;
      Vue.prototype.$alert = MessageBox.alert;
      Vue.prototype.$confirm = MessageBox.confirm;
      Vue.prototype.$prompt = MessageBox.prompt;
      Vue.prototype.$notify = Notification;
      Vue.prototype.$message = Message;
    
    };
    

    经过以上代码可以看出来Vue.use相当于一个反向调用的钩子,通过在内部反向调用各个组件的install方法来实现全局注册,最后达到一次注册全局使用的目的。

  • 相关阅读:
    Software Solutions CACHE COHERENCE AND THE MESI PROTOCOL
    CACHE COHERENCE AND THE MESI PROTOCOL
    Multiprocessor Operating System Design Considerations SYMMETRIC MULTIPROCESSORS
    Organization SYMMETRIC MULTIPROCESSORS
    PARALLEL PROCESSING
    1分钟内发送差评邮件
    Secure Digital
    SYMMETRIC MULTIPROCESSORS
    A Taxonomy of Parallel Processor Architectures
    parallelism
  • 原文地址:https://www.cnblogs.com/bcde/p/14517434.html
Copyright © 2011-2022 走看看