您的当前位置:首页正文

使用 Vue cli 3.0 构建自定义组件库的方法

2023-12-06 来源:站点网
导读1、什么是MVVM框架?它适用于哪些场景? MVVM框架是一个 Model-View-View Model框架,其中 ViewModel连接模型Model)和视图(View)。 在数据操作比较多的场景中,MVVM框架更合适,有助于通过操作数据渲染页面。 2、active- class是哪个组件的属性? 它是 vue-router模块的 router-link组件的属性。 3、如何定义Vue- router的动态路由?

本文旨在给大家提供一种构建一个完整 UI 库脚手架的思路:包括如何快速并优雅地构建UI库的主页、如何托管主页、如何编写脚本提升自己的开发效率、如何生成 CHANGELOG 等

前言

主流的开源 UI 库代码结构主要分为三大部分:

  • 组件库本身的代码:这部分代码会发布到 npm 上
  • 预览示例和查看文档的网站代码:类似 Vant、ElementUI 这类网站。
  • 配置文件和脚本文件:用于打包和发布等等
  • 编写此博文的灵感 UI 框架库( vue-cards ),PS:此 UI框架库相对于Vant、ElementUI会比较简单点,可以作为一份自定义UI框架库的入坑demo,同时这篇博文也是解读这份 UI 框架库的构建到上线的一个过程

    前置工作

    以下工作全部基于 Vue CLI 3.x,所以首先要保证机子上有 @vue/cli

    vue create vtp-component # vtp-component 作为教学的库名vue-router , dart-sass , babel , eslint 这些是该项目使用的依赖项,小主可以根据自己的需求进行相应的切换

    start

    开始造轮子了

    工作目录

    在根目录下新增四个文件夹,一个用来存放组件的代码(packages),一个用来存放 预览示例的网站 代码(examples)(这里直接把初始化模板的 src 目录更改为 examples 即可,有需要的话可以将该目录进行清空操作,这里就不做过多的说明),一个用来存放编译脚本代码(build)修改当前的工作目录为以下的格式吗,一个用来存放自定义生成组件和组件的说明文档等脚本(scripts)

    |--- build      ||--- examples||--- packages|

    |--- scripts

    让 webpack 编译 examples

    由于我们将 src 目录修改成了 examples,所以在 vue.config.js 中需要进行相应的修改

    const path = require('path')function resolve (dir) { return path.join(__dirname, dir)}module.exports = { productionSourceMap: true, // 修改 src 为 examples pages: { index: { entry: 'examples/main.js', template: 'public/index.html', filename: 'index.html' } }, chainWebpack: config => { config.resolve.alias .set('@', resolve('examples')) }}

    添加编译脚本

    package.json

    其中的组件 name 推荐和创建的项目名一致

    { "scripts": { "lib": "vue-cli-service build --target lib --name vtp-component --dest lib packages/index.js" }}

    修改 main 主入口文件

    { "main": "lib/vtp-component.common.js"}

    一个组件例子

    创建组件和组件文档生成脚本

    在 scripts 中创建以下几个文件,其中 create-comp.js 是用来生成自定义组件目录和自定义组件说明文档脚本, delete-comp.js 是用来删除无用的组件目录和自定义组件说明文档脚本, template.js 是生成代码的模板文件

    |--- create-comp.js||--- delete-comp.js||--- template.js

    相关的代码如下,小主可以根据自己的需求进行相应的简单修改,下面的代码参考来源 vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

    create-comp.js

    // 创建自定义组件脚本const chalk = require('chalk')const path = require('path')const fs = require('fs-extra')const uppercamelize = require('uppercamelcase')const resolve = (...file) => path.resolve(__dirname, ...file)const log = message => console.log(chalk.green(`${message}`))const successLog = message => console.log(chalk.blue(`${message}`))const errorLog = error => console.log(chalk.red(`${error}`))const { vueTemplate, entryTemplate, mdDocs} = require('./template')const generateFile = (path, data) => { if (fs.existsSync(path)) { errorLog(`${path}文件已存在`) return } return new Promise((resolve, reject) => { fs.writeFile(path, data, 'utf8', err => { if (err) { errorLog(err.message) reject(err) } else { resolve(true) } }) })}// 这里生成自定义组件log('请输入要生成的组件名称,形如 demo 或者 demo-test')let componentName = ''process.stdin.on('data', async chunk => { let inputName = String(chunk).trim().toString() inputName = uppercamelize(inputName) const componentDirectory = resolve('../packages', inputName) const componentVueName = resolve(componentDirectory, `${inputName}.vue`) const entryComponentName = resolve(componentDirectory, 'index.js') const hasComponentDirectory = fs.existsSync(componentDirectory) if (inputName) { // 这里生成组件 if (hasComponentDirectory) { errorLog(`${inputName}组件目录已存在,请重新输入`) return } else { log(`生成 component 目录 ${componentDirectory}`) await dotExistDirectoryCreate(componentDirectory) } try { if (inputName.includes('/')) { const inputArr = inputName.split('/') componentName = inputArr[inputArr.length - 1] } else { componentName = inputName } log(`生成 vue 文件 ${componentVueName}`) await generateFile(componentVueName, vueTemplate(componentName)) log(`生成 entry 文件 ${entryComponentName}`) await generateFile(entryComponentName, entryTemplate(componentName)) successLog('生成 component 成功') } catch (e) { errorLog(e.message) } } else { errorLog(`请重新输入组件名称:`) return } // 这里生成自定义组件说明文档 const docsDirectory = resolve('../examples/docs') const docsMdName = resolve(docsDirectory, `${inputName}.md`) try { log(`生成 component 文档 ${docsMdName}`) await generateFile(docsMdName, mdDocs(`${inputName} 组件`)) successLog('生成 component 文档成功') } catch (e) { errorLog(e.message) } process.stdin.emit('end')})process.stdin.on('end', () => { log('exit') process.exit()})function dotExistDirectoryCreate (directory) { return new Promise((resolve) => { mkdirs(directory, function () { resolve(true) }) })}// 递归创建目录function mkdirs (directory, callback) { var exists = fs.existsSync(directory) if (exists) { callback() } else { mkdirs(path.dirname(directory), function () { fs.mkdirSync(directory) callback() }) }}delete-comp.js // 删除自定义组件脚本const chalk = require('chalk')const path = require('path')const fs = require('fs-extra')const uppercamelize = require('uppercamelcase')const resolve = (...file) => path.resolve(__dirname, ...file)const log = message => console.log(chalk.green(`${message}`))const successLog = message => console.log(chalk.blue(`${message}`))const errorLog = error => console.log(chalk.red(`${error}`))log('请输入要删除的组件名称,形如 demo 或者 demo-test')process.stdin.on('data', async chunk => { let inputName = String(chunk).trim().toString() inputName = uppercamelize(inputName) const componentDirectory = resolve('../packages', inputName) const hasComponentDirectory = fs.existsSync(componentDirectory) const docsDirectory = resolve('../examples/docs') const docsMdName = resolve(docsDirectory, `${inputName}.md`) if (inputName) { if (hasComponentDirectory) { log(`删除 component 目录 ${componentDirectory}`) await removePromise(componentDirectory) successLog(`已删除 ${inputName} 组件目录`) log(`删除 component 文档 ${docsMdName}`) fs.unlink(docsMdName) successLog(`已删除 ${inputName} 组件说明文档`) } else { errorLog(`${inputName}组件目录不存在`) return } } else { errorLog(`请重新输入组件名称:`) return } process.stdin.emit('end')})process.stdin.on('end', () => { log('exit') process.exit()})function removePromise (dir) { return new Promise(function (resolve, reject) { // 先读文件夹 fs.stat(dir, function (_err, stat) { if (stat.isDirectory()) { fs.readdir(dir, function (_err, files) { files = files.map(file => path.join(dir, file)) // a/b a/m files = files.map(file => removePromise(file)) // 这时候变成了promise Promise.all(files).then(function () { fs.rmdir(dir, resolve) }) }) } else { fs.unlink(dir, resolve) } }) })}template.js module.exports = { vueTemplate: compoenntName => { compoenntName = compoenntName.charAt(0).toLowerCase() + compoenntName.slice(1) return `<template> <div class="vtp-${compoenntName}"> ${compoenntName} </div></template><script>export default { name: 'vtp-${compoenntName}', data () { return { } }, props: { }, methods: {}}</script><style lang="scss" scope>.vtp-${compoenntName}{}</style>` }, entryTemplate: compoenntName => { return `import ${compoenntName} from './${compoenntName}'${compoenntName}.install = function (Vue) { Vue.component(${compoenntName}.name, ${compoenntName})}export default ${compoenntName}if (typeof window !== 'undefined' && window.Vue) { window.Vue.component(${compoenntName}.name, ${compoenntName})}` }, mdDocs: (title) => { return `# ${title}<!-- {.md} -->---<!-- {.md} -->## 如何使用<!-- {.md} -->## Attributes<!-- {.md} -->| 参数 | 说明 | 类型 | 可选值 | 默认值 ||-----|-----|-----|-----|-----|| - | - | - | - | - | ` }}` }, entryTemplate: compoenntName => { return `import ${compoenntName} from './${compoenntName}'${compoenntName}.install = function (Vue) { Vue.component(${compoenntName}.name, ${compoenntName})}if (typeof window !== 'undefined' && window.Vue) { window.Vue.component(${compoenntName}.name, ${compoenntName})} }}

    在 build 中创建以下几个文件,其中 build-entry.js 脚本是用来生成自定义组件导出 packages/index.js , get-components.js 脚本是用来获取 packages 目录下的所有组件

    |--- build-entry.js||--- get-components.js

    相关的代码如下,小主可以根据自己的需求进行相应的简单修改,下面的代码参考来源 vue-cards

    build-entry.js

    const fs = require('fs-extra')const path = require('path')const chalk = require('chalk')const uppercamelize = require('uppercamelcase')const Components = require('./get-components')()const packageJson = require('../package.json')const log = message => console.log(chalk.green(`${message}`))const version = process.env.VERSION || packageJson.versionfunction buildPackagesEntry () { const uninstallComponents = [] const importList = Components.map( name => `import ${uppercamelize(name)} from './${name}'` ) const exportList = Components.map(name => `${uppercamelize(name)}`) const intallList = exportList.filter( name => !~uninstallComponents.indexOf(uppercamelize(name)) ) const content = `import 'normalize.css'${importList.join('')}const version = '${version}'const components = [ ${intallList.join(', ')}]const install = Vue => { if (install.installed) return components.map(component => Vue.component(component.name, component))}if (typeof window !== 'undefined' && window.Vue) { install(window.Vue)}export { install, version, ${exportList.join(', ')}}export default { install, version, ...components}` fs.writeFileSync(path.join(__dirname, '../packages/index.js'), content) log('packages/index.js 文件已更新依赖') log('exit')}buildPackagesEntry()get-components.js const fs = require('fs')const path = require('path')const excludes = [ 'index.js', 'theme-chalk', 'mixins', 'utils', '.DS_Store']module.exports = function () { const dirs = fs.readdirSync(path.resolve(__dirname, '../packages')) return dirs.filter(dirName => excludes.indexOf(dirName) === -1)}

    让 vue 解析 markdown

    文档中心的 UI 是如何编码的这里不做阐述,小主可以自行参照 vue-cards 中的实现方式进行改造

    需要安装以下的依赖,让 vue 解析 markdown

    npm i markdown-it-container -Dnpm i markdown-it-decorate -Dnpm i markdown-it-task-checkbox -Dnpm i vue-markdown-loader -D

    关于 vue.config.js 的配置在 vue-cards 该项目中也有了,不做阐述

    这里将补充高亮 highlight.js 以及点击 clipboard 的实现方式

    安装依赖

    npm i clipboard highlight.js改造 App.vue ,以下只是列出部分代码,小主可以根据自己的需求进行添加

    <script>import hljs from 'highlight.js'import Clipboard from 'clipboard'const highlightCode = () => { const preEl = document.querySelectorAll('pre') preEl.forEach((el, index) => { hljs.highlightBlock(el) const lang = el.children[0].className.split(' ')[1].split('-')[1] const pre = el const span = document.createElement('span') span.setAttribute('class', 'code-copy') span.setAttribute('data-clipboard-snippet', '') span.innerHTML = `${lang.toUpperCase()} | COPY` pre.appendChild(span) })}export default { name: 'App', mounted () { if ('onhashchange' in window) { window.onhashchange = function (ev) { let name = window.location.hash.substring(2) router.push({ name }) } } highlightCode() let clipboard = new Clipboard('.code-copy', { text: (trigger) => { return trigger.previousSibling.innerText } }) // 复制成功执行的回调 clipboard.on('success', (e) => { e.trigger.innerHTML = `已复制` }) }, updated () { highlightCode() }}</script>

    生成命令

    package.json 中添加以下内容,使用命令 yarn new:comp 创建组件目录及其文档或者使用命令 yarn del:comp 即可删除组件目录及其文档

    { "scripts": { "new:comp": "node scripts/create-comp.js && node build/build-entry.js", "del:comp": "node scripts/delete-comp.js && node build/build-entry.js" }}

    changelog

    在 package.json 中修改 script 字段,接下来你懂的,另一篇博客有介绍哦,小主可以执行搜索

    { "scripts": { "init": "npm install commitizen -g && commitizen init cz-conventional-changelog --save-dev --save-exact && npm run bootstrap", "bootstrap": "npm install", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0" }}

    总结

    以上所述是小编给大家介绍的使用 Vue cli 3.0 构建自定义组件库的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

    小编还为您整理了以下内容,可能对您也有帮助:

    47道基础的VueJS面试题(附答案)

    1、什么是MVVM框架?它适用于哪些场景?

    MVVM框架是一个 Model-View-View Model框架,其中 ViewModel连接模型Model)和视图(View)。

    在数据操作比较多的场景中,MVVM框架更合适,有助于通过操作数据渲染页面。

    2、active- class是哪个组件的属性?

    它是 vue-router模块的 router-link组件的属性。

    3、如何定义Vue- router的动态路由?

    在静态路由名称前面添加冒号,例如,设置id动态路由参数,为路由对象的path属性设置/:id。

    4、如何获取传过来的动态参数?

    在组件中,使用$router对象的 params.id,即 $route.params.id 。

    5、vue- router有哪几种导航钩子?

    有3种。

    第一种是全局导航钩子:router.beforeEach(to,from,next)。作用是跳转前进行判断拦截。

    第二种是组件内的钩子。

    第三种是单独路由独享组件。

    6、mint-ui是什么?如何使用?

    它是基于 Vue.js的前端组件库。用npm安装,然后通过 import导入样式和JavaScript代码。vue.use(mintUi)用于实现全局引入, import {Toast} from ' mint-ui'用于在单个组件局部引入。

    7、V-model是什么?有什么作用?

    v- model是 Vue. js中的一条指令,可以实现数据的双向绑定。

    8、Vue.js中标签如何绑定事件?

    绑定事件有两种方式。

    第一种,通过v-on指令, 。

    第二种,通过@语法糖, input@ click= doLog()/>。

    9、vuex是什么?如何使用?在哪种功能场景中使用它?

    vuex是针对 Vue. js框架实现的状态管理系统。

    为了使用vuex,要引入 store,并注入Vue.js组件中,在组件内部即可通过$ ostore访问 store对象。

    使用场景包括:在单页应用中,用于组件之间的通信,例如音乐播放、登录状态管理、加入购物车等。

    10、如何实现自定义指令?它有哪些钩子函数?还有哪些钩子函数参数?

    自定义指令包括以下两种。

    它有如下钩子函数。

    钩子函数的参数如下。

    11、至少说出vue.js中的4种指令和它们的用法。

    相关指令及其用法如下。

    12、Vue-router是什么?它有哪些组件?

    它是 Vue. js的路由插件。组件包括 router-link和 router-vIew。

    13、导航钩子有哪些?它们有哪些参数?

    导航钩子又称导航守卫,又分为全局钩子、单个路由独享钧子和组件级钧子。

    全局钩子有 beforeEach、beforeResolve(Vue2.5.0新增的)、 afterEach。

    单个路由独享钩子有 beforeEnter。

    组件级钩子有 beforeRouteEnter、 beforeRouteUpdate(Vue2.2新增的) beforeRouteLeave。

    它们有以下参数。

    14、Vue.js的双向数据绑定原理是什么?

    具体步骤如下。

    (1)对需要观察的数据对象进行递归遍历,包括子属性对象的属性,设置set和get特性方法。当给这个对象的某个值赋值时,会触发绑定的set特性方法,于是就能监听到数据变化。

    (4)MVVM是数据绑定的入口,整合了 Observer、 Compile和 Watcher三者,通过Observer来监听自己的 model数据变化,通过 Compile来解析编译模板指令,最终利用Watcher搭起 Observer和 Compile之间的通信桥梁,达到数据变化通知视图更新的效果。利用视图交互,变化更新数据 model变更的双向绑定效果。

    15、请详细说明你对Vue.js生命周期的理解。

    总共分为8个阶段,分别为 beforeCreate、created、beforeMount、 mounted、beforeUpdate、 updated、 beforeDestroyed、 destroyed。

    当使用组件的kep- alive功能时,增加以下两个周期。

    Vue2.5.0版本新增了一个周期钩子:ErrorCaptured,当捕获一个来自子孙组件的错误时调用。

    16、请描述封装Vue组件的作用过程。

    组件可以提升整个项目的开发效率,能够把页面抽象成多个相对的模块,解决了传统项目开发中效率低、难维护、复用性等问题。

    使用Vue.extend方法创建一个组件,使用Vue.component方法注册组件。子组件需要数据,可以在 props中接收数据。而子组件修改妤数据后,若想把数据传递给父组件,可以采用emit方法。

    17、你是怎样认识vuex的?

    vuex可以理解为一种开发模式或框架。它是对 Vue. js框架数据层面的扩展。通过状态(数据源)集中管理驱动组件的变化。应用的状态集中放在 store中。改变状态的方式是提交 mutations,这是个同步的事务。异步逻辑应该封装在 action中。

    18、Vue- loader是什么?它的用途有哪些?

    它是解析.vue文件的一个加载器,可以将 template/js/style转换成 JavaScript模块。

    用途是通过 vue-loader, JavaScript可以写 EMAScript 6语法, style样式可以应用scss或less, template可以添加jade语法等。

    19、请说出vue.cli项目的src目录中每个文件夹和文件的用法。

    assets文件夹存放静态资源;components存放组件;router定义路由相关的配置;view是视图;app. vue是一个应用主组件;main.js是入口文件。

    20、在Vue.cli中怎样使用自定义组件?在使用过程中你遇到过哪些问题?

    具体步骤如下。

    (1)在 components目录中新建组件文件,脚本一定要导出暴露的接口。

    (2)导入需要用到的页面(组件)。

    (3)将导入的组件注入uejs的子组件的 components属性中。

    (4)在 template的视图中使用自定义组件。

    21、谈谈你对vue.js的 template编译的理解。

    简而言之,就是首先转化成AST( Abstract Syntax Tree,抽象语法树),即将源代码语法结构抽象成树状表现形式,然后通过 render函数进行渲染,并返回VNode( Vue. js的虚拟DOM节点)。

    详细步骤如下。

    (1)通过 compile编译器把 template编译成AST, compile是 create Compiler的返回值, createCompiler用来创建编译器。另外, compile还负责合并 option。

    (2)AST会经过 generate(将AST转化成 render funtion字符串的过程)得到 render函数, render的返回值是 VNode, VNode是 Vue.Js的虚拟DOM节点,里面有标签名子节点、文本等。

    22、说一下Vue.js中的MVVM模式。

    MVVM模式即 Model- View- ViewModel模式。

    Vue.js是通过数据驱动的, Vue. js实例化对象将DOM和数据进行绑定,一旦绑定,和数据将保持同步,每当数据发生变化,DOM也会随着变化。

    ViewModel是Vue.js的核心,它是 Vue.js的一个实例。Vue.js会针对某个HTML元素进行实例化,这个HTML元素可以是body,也可以是某个CSS选择器所指代的元素。

    DOM Listeners和 Data Bindings是实现双向绑定的关键。DOM Listeners监听页面所有View层中的DOM元素,当发生变化时,Model层的数据随之变化。Data Bindings会监听 Model层的数据,当数据发生变化时,View层的DOM元素也随之变化。

    23、v-show指令和v-if指令的区别是什么?

    v-show与v-if都是条件渲染指令。不同的是,无论v-show的值为true或 false,元素都会存在于HTML页面中;而只有当v-if的值为true时,元素才会存在于HTML页面中。v-show指令是通过修改元素的 style属性值实现的。

    24、如何让CSS只在当前组件中起作用?

    在每一个Vue.js组件中都可以定义各自的CSS、 JavaScript代码。如果希望组件内写的CSS只对当前组件起作用,只需要在Style标签添加Scoped属性,即 。

    25、如何创建vue.js组件?

    在vue.js中,组件要先注册,然后才能使用。具体代码如下

    26、如何实现路由嵌套?如何进行页面跳转?

    路由嵌套会将其他组件渲染到该组件内,而不是使整个页面跳转到 router-view定义组件渲染的位置。要进行页面跳转,就要将页面渲染到根组件内,可做如下配置。

    首先,实例化根组件,在根组件中定义组件渲染容器。然后,挂载路由,当切换路由时,将会切换整个页面。

    27、ref属性有什么作用?

    有时候,为了在组件内部可以直接访问组件内部的一些元素,可以定义该属性此时可以在组件内部通过this. $refs属性,更快捷地访问设置ref属性的元素。这是一个原生的DOM元素,要使用原生 DOM API操作它们,例如以下代码。

    注意:在Ve2.0中,ref属性替代了1.0版本中v-el指令的功能。

    28、Vue. js是什么?

    Vue. js的目标是通过尽可能简单的API实现响应式的数据绑定的组件开发。

    29、描述vue.js的一些特性。

    Vue.js有以下持性。

    (1)MVVM模式。

    数据模型( Model)发生改变,视图(View)监听到变化,也同步改变;视图(View)发生改变,数据模型( Model)监听到改变,也同步改变。

    使用MVVM模式有几大好处。

    (2)组件化开发

    (3)指令系统

    (4)Vue2.0开始支持虚拟DOM。

    但在Vue1.0中,操作的是真实DOM元素而不是虚拟DOM,虚拟DOM可以提升页面的渲染性能。

    30、描述vue.js的特点。

    Vue. js有以下特点。

    31、在vue.js中如何绑定事件?

    通过在v-on后跟事件名称=“事件回调函数( )”的语法绑定事件。事件回调函数的参数集合( )可有可无。如果存在参数集合( ),事件回调函数的参数需要主动传递,使用事件对象要传递 $event。当然,此时也可以传递一些其他自定义数据。如果没有参数集合,此时事件回调函数有一个默认参数,就是事件对象。事件回调函数要定义在组件的 methods属性中,作用域是 Vue. js实例化对象,因此在方法中,可以通过this使用 Vue. js中的数据以及方法,也可以通过@语法糖快速绑定事件,如@事件名称=“事件回调函数( )”。

    32、请说明 组件的作用。

    当 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。

    keep-alive>是一个抽象组件,它自身不会渲染一个DOM元素,也不会出现在父组件链中。

    当在 内切换组件时,它的 activated和 deactivated这两个生命周期钧子函数将会执行。

    33、axios是什么?如何使用它?

    axios是在vue2.0中用来替换 vue-resource.js插件的一个模块,是一个请求后台的模。

    用 npm install axios安装 axios。基于 EMAScript 6 的 EMAScript Mole规范,通过 import关键字将 axios导入,并添加到 Vue. js类的原型中。这样每个组件(包括vue.js实例化对象)都将继承该方法对象。它定义了get、post等方法,可以发送get或者post请求。在then方法中注册成功后的回调函数,通过箭头函数的作用域特征,可以直接访问组件实例化对象,存储返回的数据。

    34、在 axios中,当调用 axios.post('api/user')时进行的是什么操作?

    当调用post方法表示在发送post异步请求。

    35、sass是什么?如何在ue中安装和使用?

    sass是一种CSS预编译语言安装和使用步骤如下。

    (1)用npm安装加载程序( sass-loader、 css-loader等加载程序)。

    (2)在 webpack. config. js中配置sass加载程序。

    (3)在组件的 style标签中加上lang属性,例如lang="scss"。

    36、如何在 Vue. js中循环插入图片?

    对“src”属性插值将导致404请求错误。应使用 v-bind:src格式代替。

    代码如下:

    在Vue中如何使用elementUI实现自定义主题方法

    下面我就为大家分享一篇Vue的elementUI实现自定义主题方法,具有很好的参考价值,希望对大家有所帮助。

    使用vue开发项目,用到elementUI,根据官网的写法,我们可以自定义主题来适应我们的项目要求,下面来介绍一下两种方法实现的具体步骤,(可以参考官方文档自定义主题官方文档),先说项目中没有使用scss编写,用主题工具的方法(使用的较多)

    第一种方法:使用命令行主题工具

    使用vue-cli安装完项目并引入element-ui(具体可参考第二种方法中的介绍)

    一、安装工具

    1,安装主题工具

    npm i element-theme -g2,安装chalk主题,可以从 npm 安装或者从 GitHub 拉取最新代码

    # 从 npm

    npm i element-theme-chalk -D

    # 从 GitHub

    npm i https://github.com/ElementUI/theme-chalk -D二、初始化变量文件

    et -i [可以自定义变量文件,默认为element-variables.scss]

    > ? Generator variables file这时根目录下会产生element-variables.scss(或自定义的文件),大致如下:

    $--color-primary: #409EFF !default;

    $--color-primary-light-1: mix($--color-white, $--color-primary, 10%) !default; /* 53a8ff */

    $--color-primary-light-2: mix($--color-white, $--color-primary, 20%) !default; /* 66b1ff */

    $--color-primary-light-3: mix($--color-white, $--color-primary, 30%) !default; /* 79bbff */

    $--color-primary-light-4: mix($--color-white, $--color-primary, 40%) !default; /* 8cc5ff */

    $--color-primary-light-5: mix($--color-white, $--color-primary, 50%) !default; /* a0cfff */

    $--color-primary-light-6: mix($--color-white, $--color-primary, 60%) !default; /* b3d8ff */

    $--color-primary-light-7: mix($--color-white, $--color-primary, 70%) !default; /* c6e2ff */

    $--color-primary-light-8: mix($--color-white, $--color-primary, 80%) !default; /* d9ecff */

    $--color-primary-light-9: mix($--color-white, $--color-primary, 90%) !default; /* ecf5ff */

    $--color-success: #67c23a !default;

    $--color-warning: #eb9e05 !default;

    $--color-danger: #fa5555 !default;

    $--color-info: #878d99 !default;

    ...三、修改变量

    直接编辑 element-variables.scss 文件,例如修改主题色为自己所需要的颜色(如: 紫色(purple))

    $--color-primary: purple;四、编译主题

    修改完变量后,要编译主题(如果编译后,再次修改了变量,需要重新编译)

    et

    > ? build theme font

    > ? build element theme五、引入自定义主题

    最后一步,将编译好的主题文件引入项目(编译的文件默认在根目录下的theme文件下,也可以通过 -o 参数指定打包目录),在入口文件main.js中引入

    import '../theme/index.css'

    import ElementUI from 'element-ui'

    import Vue from 'vue'

    Vue.use(ElementUI)在项目中写些样式,看下主题色是否改变:(主题色变为紫色)

    <p>

    <el-button>默认按钮</el-button>

    <el-button type="primary">主要按钮</el-button>

    <el-button type="success">成功按钮</el-button>

    <el-button type="info">信息按钮</el-button>

    <el-button type="warning">警告按钮</el-button>

    <el-button type="danger">危险按钮</el-button>

    </p>第二种方法: 直接修改element样式变量

    在项目中直接修改element的样式变量,(前提是你的文档也是使用scss编写)

    一、首先用vue-cli安装一个新项目:

    1,安装vue:

    npm i -g vue2,在项目目录下安装vue-cli:

    npm i -g vue-cli3,基于webpack建立新项目( vue-project)

    vue init webpack vue-project4,依次输入以下命令行,运行vue-project

    cd vue-project

    npm i

    npm run dev二、安装elementUI以及sass-loader,node-sass(项目中使用scss编写需要依赖的插件)

    1,安装element-ui

    npm i element-ui -S2,安装sass-loader,node-sass

    npm i sass-loader node-sass -D在这里说一下,不需要配置webpack.base.conf.js文件,vue-loader会根据不同类型文件来配置相应loader来打包我们的样式文件(感兴趣的可看下vue-loader的核心代码)

    三、改变element样式变量

    1.在src下建立element-variables.scss文件(名字可以自定义),写入如下代码:

    /* 改变主题色变量 */

    $--color-primary: teal;

    /* 改变 icon 字体路径变量,必需 */

    $--font-path: '../node_moles/element-ui/lib/theme-chalk/fonts';

    @import "../node_moles/element-ui/packages/theme-chalk/src/index";2.在入口文件main.js中引入上面的文件即可

    import Vue from 'vue'

    import Element from 'element-ui'

    import './element-variables.scss'

    Vue.use(Element)看下效果吧,在文件里引入些样式看看,如button

    <p>

    <el-button>默认按钮</el-button>

    <el-button type="primary">主要按钮</el-button>

    <el-button type="success">成功按钮</el-button>

    <el-button type="info">信息按钮</el-button>

    <el-button type="warning">警告按钮</el-button>

    <el-button type="danger">危险按钮</el-button>

    </p>默认的颜色已经变为我们自定义的了,有其他的改变在element-variable.scss文件中改变变量即可

    上面是我整理给大家的,希望今后会对大家有帮助。

    相关文章:

    如何使用ngrok+express解决微信接口调试问题

    如何使用vue-cli编写vue插件

    在vue-cli下使用vuex(详细教程)

    Web前端组件库OpenTiny项目如何使用?

    目前华为云出品的开源项目OpenTiny其中包含两个组件库项目一个是TinyVue还有一个是TinyNG当然还包含拥有主题配置系统/中后台模板/TinyCLI 命令行等效率提升工具

    接着说下TinyVue是如何使用的:其实非常简单。

    1. 将TinyVue导入您的项目中。您可以通过npm或者手动下载方式将TinyVue导入您的项目中。

    2. 创建一个Vue实例。您可以在Vue实例中注册TinyVue的组件,以便在您的应用程序中使用这些组件。

    3. 在Vue实例中使用组件。您可以在Vue模板中使用TinyVue组件,以便在您的应用程序中显示这些组件。 例如,假设您已经将TinyVue导入您的项目中,并已经创建了一个Vue实例,现在您可以按照以下方式在模板中使用TinyVue的Button组件:

    以上代码展示了如何在Vue模板中使用TinyVue的Button组件。在模板中,可以像使用普通的HTML元素一样使用TinyVue的组件,同时也可以为它们设置事件*,以便在用户与这些组件交互时,对这些事件进行响应。

    再说下TinyNG是如何使用的:

    1. 下载并导入TinyNG组件库的CSS和JS文件到项目中。

    2. 在HTML文件中引入相关的CSS和JS文件。

    3. 在页面中使用组件库提供的组件和工具。

    例如,使用按钮组件:

    当然,除了按钮组件,还有很多其他的组件和工具,可以根据实际需求使用。

    其实具体的可以直接进入OpenTiny官网 里面有具体的文档说明并提供了详细的组件和工具的使用说明和示例代码,使用起来也是非常方面。现如今组件库其实非常多,OpenTiny核心优势也是非常明显。所以大家感兴趣也可以去尝试下。

    说到Web前端组件库,OpenTiny其实是个非常不错的选择,具体说起来,首先想到的就是组件丰富:主要有70+基础组件,1500+组件API,接口、功能和细节配置都是非常丰富的,同时Table、Tree、Select等高频组件均内置虚拟滚动,在10万大数据场景下保持丝滑体验,性能是非常高的。然后就是TinyVue采用组件与框架分离的设计理念,将组件逻辑抽离成纯函数,实现跨端、跨框架、跨版本,灵活可配,适应未来。同时两个组件库是涵盖 Vue2/Vue3/Angular 多技术栈。并且支持数据驱动的配置式使用方式。最后其实TinyVue和TinyNG两个组件库都可以称得上企业级安全保障,所有接口杜绝 XSS 攻击,100% 安全放心,节省代码看护成本。并且组件库使用也是非常稳定的,经过九年持续打磨,服务于上千个项目,千锤百炼,稳定可靠。

    如果你OpenTiny 的开源项目感兴趣,也可以添加小助手微信:opentiny-official,拉你进群,一起交流前端技术,一起玩开源。

    Web前端组件库OpenTiny项目如何使用?

    目前华为云出品的开源项目OpenTiny其中包含两个组件库项目一个是TinyVue还有一个是TinyNG当然还包含拥有主题配置系统/中后台模板/TinyCLI 命令行等效率提升工具

    接着说下TinyVue是如何使用的:其实非常简单。

    1. 将TinyVue导入您的项目中。您可以通过npm或者手动下载方式将TinyVue导入您的项目中。

    2. 创建一个Vue实例。您可以在Vue实例中注册TinyVue的组件,以便在您的应用程序中使用这些组件。

    3. 在Vue实例中使用组件。您可以在Vue模板中使用TinyVue组件,以便在您的应用程序中显示这些组件。 例如,假设您已经将TinyVue导入您的项目中,并已经创建了一个Vue实例,现在您可以按照以下方式在模板中使用TinyVue的Button组件:

    以上代码展示了如何在Vue模板中使用TinyVue的Button组件。在模板中,可以像使用普通的HTML元素一样使用TinyVue的组件,同时也可以为它们设置事件*,以便在用户与这些组件交互时,对这些事件进行响应。

    再说下TinyNG是如何使用的:

    1. 下载并导入TinyNG组件库的CSS和JS文件到项目中。

    2. 在HTML文件中引入相关的CSS和JS文件。

    3. 在页面中使用组件库提供的组件和工具。

    例如,使用按钮组件:

    当然,除了按钮组件,还有很多其他的组件和工具,可以根据实际需求使用。

    其实具体的可以直接进入OpenTiny官网 里面有具体的文档说明并提供了详细的组件和工具的使用说明和示例代码,使用起来也是非常方面。现如今组件库其实非常多,OpenTiny核心优势也是非常明显。所以大家感兴趣也可以去尝试下。

    说到Web前端组件库,OpenTiny其实是个非常不错的选择,具体说起来,首先想到的就是组件丰富:主要有70+基础组件,1500+组件API,接口、功能和细节配置都是非常丰富的,同时Table、Tree、Select等高频组件均内置虚拟滚动,在10万大数据场景下保持丝滑体验,性能是非常高的。然后就是TinyVue采用组件与框架分离的设计理念,将组件逻辑抽离成纯函数,实现跨端、跨框架、跨版本,灵活可配,适应未来。同时两个组件库是涵盖 Vue2/Vue3/Angular 多技术栈。并且支持数据驱动的配置式使用方式。最后其实TinyVue和TinyNG两个组件库都可以称得上企业级安全保障,所有接口杜绝 XSS 攻击,100% 安全放心,节省代码看护成本。并且组件库使用也是非常稳定的,经过九年持续打磨,服务于上千个项目,千锤百炼,稳定可靠。

    如果你OpenTiny 的开源项目感兴趣,也可以添加小助手微信:opentiny-official,拉你进群,一起交流前端技术,一起玩开源。

    vue高德地图 如何一次添加多个点标记到地图实例?

    首先你需要提交你的公司的资料信息,地址信息 ,公司名称 以及电话信息,门脸照片给官方,
    提交给官方后,他们会审核的,一般都是 1-7个工作日审核 审核通过后1-3天时间展现
    如果发现地图有错误,可以进行纠错处理。

    vue高德地图 如何一次添加多个点标记到地图实例?

    首先你需要提交你的公司的资料信息,地址信息 ,公司名称 以及电话信息,门脸照片给官方,
    提交给官方后,他们会审核的,一般都是 1-7个工作日审核 审核通过后1-3天时间展现
    如果发现地图有错误,可以进行纠错处理。

    Java培训班一般都教什么内容?

    1、Java基础

    初识Java:Java入门,Java基础,Java使用技巧

    面向对象编程:Java面向对象编程理论与应用,集合框架与数据结构,Java文件操作与网络编程

    数据库理论与应用:数据存储的概念及理论,数据库技术及产品的发展史,当下流行数据库MySQL和Oracle数据库的使用

    互联网网站及信息系统的开发与应用:网站页面及效果设计,交互式网站开发技术及开发流 程,网站开发框架及简单企业开发应用

    2、java中级

    企业团队项目协同开发与维护:协同开发概述,协同开发技术原理与应用

    商业项目模块化基础与应用:软件项目自动化构建概述,自动化构建原理,自动化构建技术与应用

    软件项目测试与实施:软件测试概述,软件测试流程及测试工具使用,测试档案及测试用例编写,测试报告分析

    企业主流开发框架应用与优化:框架技术概述,框架技术发展史,主流框架介绍,主流框架的使用,整合多个框架综合开发项目

    3、java高级

    网站及信息管理系统的视觉美化:网站前端视觉美化概述,网站前端UI概述,网站前端UI框架概述,主流网站前端UI使用

    网站及信息管理系统性能调优:分布式系统概述,数据缓存概述,分布式数据缓存技术及工具的使用

    网站及信息管理系统业务个性化定制:企业定时任务与邮件发送业务,企业统计报表及网络服务业务,企业搜索引擎业务

    4、java资深

    分布式项目管理与项目构建:分布式概述,分布式特点与问题,分布式项目开发工具概述与使用

    Java前沿框架解析:Java前沿框架概述,Java前沿框架优势与未来趋势,Java 前沿框架的使用与项目整合

    蓝鸥OA:企业真实项目实战:项目概述,团队项目开发流程概述与实施,项目开发工具使用,项目流程与质量控制,项目测试与项目发布,项目实施与项目维护

    电脑开机360提示:svchost.exe占用CPU超50%,结束进程后,导致不能上网

    楼上好多复制的哦,我以前也有这问题,楼上方法均无效。。

           传说中的SVCHOST很狂,曾经也是占我CPU50%还要多,是系统升级造成的,为了怕网友们也遇上这个问题,解决方法也打出来吧:)查看任务管理器里占CPU50%的SVCHOST.EXE,然后打开CMD,输入tasklist/svc,找和任务管理器里占CPU的SVCHOST.EXE对应的PID,我找到PID为1700的SVCHOST,它里面加载了一些服务,我的是P2PIMSVC在吃我的CPU,打开 services.msc找到Peer Networking Identity Manager禁用掉(禁用就行了,没什么用,如果你没有点对点网络标识的话)

        希望对你有帮助,此方法没有借助网络,自己解决的,应该没什么问题。:)

        我装三连屏的时候重装了系统就是这个问题用此方法解决的。当是还有system占我50%CPU,解决方法也在我空间里:) 

         

        在任务管理器中添加PID列的方法是打开任务管理器,查看--选择列---PID打勾

    站点网还为您提供以下相关内容希望对您有帮助:

    Vue——自定义组件 &amp; 自定义事件$emit &amp; 插槽slot

    在 components 选项中定义局部组件。每个组件就是一个小型的Vue实例,它里面除了不能设置el选项,其他选项它都有。 组件名称: 自定义,可以使用驼峰命名方式或者短横线的命名方式,但是需要注意的是如果应用到DOM中,就只能...

    详解基于vue-cli3.0如何构建功能完善的前端架子

    @import "custom_normalize"; // 自定义的normalizerem布局在移动端下使用rem布局是个不错的选择,既然我们使用里的scss,那么可以使用函数来简化我们的重复计算的工作。设计给到的通常是2倍图,宽为750px,那么我们可以将基准设为 document...

    Vue组件开发有哪些技巧

    Vue 单文件组件开发当使用vue-cli初始化一个项目的时候,会发现src/components文件夹下有一个HelloWorld.vue文件,这便是单文件组件的基本开发模式。// 注册Vue.component('my-component', { template: 'A custom component!...

    vue 自定义组件之父子组件

    在使用子自定义组件时,给组件标签添加一个 ref 属性,然后就可以通过 $refs 返回拥有ref属性的组件:在控制台可以看见获取到的子组件数组:    因为返回的是对象,所以可以通过ref值来操作子组件的值。

    Vform Vue3自定义组件(vant篇)

    至此vForm3中引入vant组件功能(字段组件)完全实现 1、src-&gt;extension自定义组件主要文件夹 2、src-&gt;utils 公共属性配置文件夹 3、src—&gt;form-designer 主工程编译器

    vue 自定义全局方法,在组件里面的使用介绍

    在main.js里进行全局注册 Vue.prototype.funcName = function (){} 在所有组件里可调用 this.funcName();以上这篇vue 自定义全局方法,在组件里面的使用介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望...

    如何使用vue注册组件

    }) Vue.component()的第1个参数是标签名称,第2个参数是一个选项对象,使用选项对象的template属性定义组件模板。使用这种方式,Vue在背后会自动地调用Vue.extend()。 components实现局部注册var vm2 = new Vue({ el: '#app2', ...

    vue 自定义组件使用v-model

    v-model 是 Vue2 中唯一支持双向绑定的指令,用于表单控件绑定,但不代表它只能用在表单控件之上。在文档 使用自定义事件的表单输入组件 一节中提到了, v-model 其实是个语法糖。这不过是以下示例的语法糖:也就是说...

    videojs在vue中的使用(自定义组件,如清晰度)

    该方式使用以创建好的video标签,只是简单的改变video的src。注意,此时的自定义组件(如清晰度)并没有更新,里面的数据还是上一个视频的信息,需要手动更新,可以手动移除后再添加。该方式首先会调用dispose方法销毁已经创建的...

    vue-cli3.0安装element-ui组件及按需引入element-ui组件

    1,在 命令行输入   vue add element 2,How do you want to import Element? --&gt;选择 Import on demand (关键)按需引入 ❯ Fully import  全局引入 Choose the locale you want to load...

    本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

    精彩推荐

    更多阅读

    Top