vue构建小项目(五)(插件的发布与使用)

1.目的

经过前面四节在总结,已经构建了一个非常简陋的移动端小项目。在这次的项目中发现了一个组件或者场景可能会在今后的项目中使用。所以想把这个组件提取出来,一是总结,二是备份,为以后的项目做下基础和准备。

2.描述

图片.png

如图所示,目的就是提取这部分功能,其实就是一个axios请求的数据按照自己设定的样式,模拟原声select功能,点击弹窗模拟select-option功能。
那么~这个思路 就相当于是对mint-ui的二次封装吧。

3.目标

实现一个可复用的select样式的下拉框,更好的点的可以支持二级联动
上代码

<template>
  <div class="perparContent">
    <span
      class="singlePerparInfo"
      v-on:click="modelIdClick"
    >{{modelName}}<a class="down-arrow"></a></span>
    <span
      v-show="parentData.subShow"
      class="singlePerparInfo"
      v-on:click="brandIdClick"
    >{{brandName}}<a class="down-arrow"></a></span>
    <mt-popup
      v-model="popupVisible"
      position="bottom"
      class="mint-popup-4"
    >
      <div class="page-picker-wrapper">
        <mt-picker
          :slots="modelsKey"
          value-key="name"
          @change="onValuesChangeOfModel"
          :visible-item-count="5"
          ref="picker"
        ></mt-picker>
      </div>
    </mt-popup>
    <mt-popup
      v-model="brandPopupVisible"
      position="bottom"
      class="mint-popup-4"
    >
      <div class="page-picker-wrapper">
        <mt-picker
          :slots="brandsKey"
          value-key="name"
          @change="onValuesChangeOfBrand"
          :visible-item-count="5"
          ref="picker"
        ></mt-picker>
      </div>
    </mt-popup>
  </div>
</template>

简单的说就是两个mint-ui组件,分别是两个popup和picker,通过父组件的传值控制第二个popup的显示与隐藏。js部分:

import { Popup } from "mint-ui";
import { Toast } from "mint-ui";
export default {
  name: "mintSelect",
  props: {
    parentData: {}
  },
  data() {
    return {
      subShow: false,
      popupVisible: false,
      brandPopupVisible: false,
      modelName: "全部",
      brandName: "全部",
      brandId: "",
      modelId: "",
      modelsKey: [
        //车系
        {
          flex: 1,
          values: [
            {
              index: 0,
              code: "",
              name: "全部"
            }
          ],
          textAlign: "center",
          className: "slot1",
          defaultIndex: 0
        }
      ],
      brandsKey: [
        //品牌
        {
          flex: 1,
          values: [
            {
              index: 0,
              code: "",
              name: "全部"
            }
          ],
          textAlign: "center",
          className: "slot1",
          defaultIndex: 0
        }
      ]
    };
  },
  mounted: function() {
    //初始化车型库
    this.getModelKey();
  },
  methods: {
    //点击车型
    modelIdClick() {
      this.popupVisible = true;
    },
    //点击品牌
    brandIdClick() {
      this.brandPopupVisible = true;
    },
    onValuesChangeOfBrand(picker, values) {
      this.brandName = values[0].name;
      var data = {
        name: "brand",
        code: values[0].code
      };
      this.brandId = values[0].code;
      //子组件向父组件传递参数
      ///this.$emit("func", data);
    },
    onValuesChangeOfModel(picker, values) {
      this.modelName = values[0].name;
      var data = {
        name: "model",
        code: values[0].code
      };
      this.modelId = values[0].code;
      //切换model
      var code = values[0].code;
      //子组件向父组件传递参数
      //this.$emit("func", data);
      var url = this.HOME + this.parentData.subPostUrl + code; //HOME变量为已挂载的可跨域域名,这里将其拼接完,成为一个完整路径
      this.$axios({
        //this代表vue对象,之前在入口文件中把axios挂载到了vue中,所以这里直接用this.$axios调用axios对象
        method: "get",
        url: url,
        data: {}
      })
        .then(res => {
          var arr = res.data.data;
          var values = [];
          //模型对象中转
          for (const item in arr) {
            var single = {
              index: parseInt(item),
              code: arr[item].id,
              name: arr[item].name
            };
            values.push(single);

            this.brandsKey[0].values.push(single);
          }
          //this.$refs.picker.setSlotValues(0, values);
          console.log(this.modelsKey);
          //this.modelsKey = res.data.modelkey;
        })
        .catch(err => {
          //console.log(err);
          Toast(err.data.result.resultDesc);
        });
    },
    getModelKey() {
      var url = this.HOME + this.parentData.postUrl; //HOME变量为已挂载的可跨域域名,这里将其拼接完,成为一个完整路径
      var param = this.parentData.param || {};
      this.$axios({
        //this代表vue对象,之前在入口文件中把axios挂载到了vue中,所以这里直接用this.$axios调用axios对象
        method: "post",
        url: url,
        data: param
      })
        .then(res => {
          var arr = res.data.data.modelkey;
          var values = [];
          //模型对象中转
          for (const item in arr) {
            var single = {
              index: parseInt(item),
              code: arr[item].id,
              name: arr[item].name
            };
            values.push(single);

            this.modelsKey[0].values.push(single);
          }
          //this.$refs.picker.setSlotValues(0, values);
          console.log(this.modelsKey);
          //this.modelsKey = res.data.modelkey;
        })
        .catch(err => {
          //console.log(err);
          Toast(err.data.result.resultDesc);
        });
    }
  }
};

就是请求后台数据,监听popup值的变化。

上传npm的注意事项

必须有一个入口文件

{
  "name": "vue-mint-select",
  "version": "1.0.5",
  "description": "修正插件的入口文件",
  "author": "aladdingod <hanke19891229@163.com>",
  "main": "index.js",
  "private": false,
  "scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "start": "npm run dev",
    "lint": "eslint --ext .js,.vue src",
    "build": "node build/build.js ",
    "lib": "vue-cli-service build --target lib --name vue-mint-select --dest lib src/cusPlugins/index.js"
  },

外侧创建的index.js

就是自己定义的组件的入口
module.exports = require('./src/cusPlugins/index.js')

index.js

const requireComponent = require.context('./', true, /\.vue$/)

const install = Vue => {
  if (install.installed) return
  install.installed

  requireComponent.keys().map(component => {
    const config = requireComponent(component)
    const componentName = config.default.name
    Vue.component(componentName, config.default || config)
  })
}
export default {
  install
}
引入所有的自定义组件内容,就是遍历目标目录下的vue文件

发布 npm publish

插件的使用

安装

npm install mint-select

引入依赖

import Vue from 'vue'
import App from './App'
import Mint from 'mint-ui'
Vue.use(Mint)
import 'mint-ui/lib/style.css'
import pickerAndSheets from 'mint-select'
Vue.use(pickerAndSheets)
import axios from 'axios'
Vue.prototype.$axios = axios

插件的使用

<mintSelect     v-bind:parentData="parentData"
      @func="getModelOrBrand">
    </mintSelect>

插件之前的传值

export default {
  name: "App",
  components: {},
  data() {
    return {
      parentData: {
        postUrl: "/wx/condition", //第一个select获取数据请求的地址
        subPostUrl: "/wx/getBrandByModel?modelid=", //第二个select获取数据请求的地址
        subShow: true, //是否显示第二个select
        param: {
          test: "123" //第一个 请求所携带的参数,也可以不传默认为{}
        }
      }
    };
  },
  methods: {
    //emit子父组件传值
    //子组件传递给父组件的值,就是选择的select的内容
    getModelOrBrand(data) {
      this.param.brandId = data.brand;
      this.param.modelId = data.model;
    }
  }
};
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容