关于vue.js:eltooltip组件二次封装超出宽度再展示

文字超出宽度,省略号展现,hover文字,用el-tooltip展现全副。文字未超出,el-tooltip不展现。留神disabled属性。 <template> <el-tooltip :effect="dark" :content="text" :disabled="disableTip" :placement="placement" > <div class="ellipsis" :class="className" @mouseover="onMouseOver"> <span ref="ellipsis">{{text}}</span> </div> </el-tooltip></template><script>export default { name: 'EllipsisTooltip', props: { text: { type: String, default: '' }, placement: { type: String, default: 'top-start' }, effect: { type: String, default: 'dark' }, className: { type: String, default: '' }, }, data() { return { disableTip: false, } }, methods: { onMouseOver() { let parentWidth = this.$refs['ellipsis'].parentNode.offsetWidth let contentWidth = this.$refs['ellipsis'].offsetWidth this.disableTip = contentWidth <= parentWidth }, },}</script><style scoped lang="scss">.ellipsis { width: 100%; overflow: hidden; white-space: nowrap; text-overflow: ellipsis;}</style>应用: ...

October 22, 2021 · 1 min · jiezi

关于vue.js:vue中使用Vueextend方法仿写一个loading加载中效果

需要形容本文咱们应用vue的extend办法实现一个全屏loading加载成果,需要如下: 通过命令就能够让弹框开启或敞开,比方this.$showDialog()开启,this.$hideDialog()敞开办法能够传参更改loading中的文字也能够传参更改loading背景色当然这里除了文字,背景色什么的,也能够传递更多的参数,具体能够依据业务场景设计,为了便于了解文章这里就不赘述了。咱们先看一下效果图: 效果图 代码实现第一步,新建loading组件比方咱们在src目录下,新建loading文件夹用于寄存loading相干文件,在这个文件夹下新建的loading.vue文件是用来做弹出框的组件 src/loading/loading.vue <template>  <!-- 关上弹框的动画 -->  <transition name="animation">    <div      class="loadindWrap"      v-if="showLoading"      :style="{ background: backgroundColor }"    >      <div class="loadingContent">        <div class="iBox">          <i class="el-icon-loading"></i>        </div>        <div class="text">{{ text }}</div>      </div>    </div>  </transition></template><script>export default {  data() {    return {      showLoading: false, // 管制显示与暗藏的标识      backgroundColor: "rgba(0, 0, 0, 0.5)", // 默认背景色      text: "加载中...", // 默认文字    };  },};</script><style lang="less" scoped>.loadindWrap {  position: absolute;  top: 0;  left: 0;  width: 100%;  height: 100%;  display: flex;  justify-content: center;  align-items: center;  .loadingContent {    color: rgb(160, 233, 66);    text-align: center;    .iBox {      margin-bottom: 6px;      i {        font-size: 20px;        color: #bfa;      }    }  }}// 加一个过渡成果.animation-enter, .animation-leave-to { opacity: 0;}.animation-enter-active, .animation-leave-active { transition: opacity 0.6s; }</style>第二步,新建index.js文件比方咱们在src目录下,新建的loading文件夹中再新建一个index.js文件用来书写相应js代码,用于管制loading弹框。 ...

October 22, 2021 · 2 min · jiezi

关于vue.js:vuejs使用高德地图实现多个颜色的轨迹路线

1.引入高德地图,这里采纳cdn形式引入 <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.3&key=本人申请的key"></script>2.增加div作为地图的容器,同时为该div指定id属性,地图的高度和宽度也要指定 <div class="custom_map" id="allmap"></div>3.初始化地图配置 init() { this.map = new AMap.Map("allmap", { resizeEnable: true, zoom: 11, //级别 center: [113.88229, 22.896067], //中心点坐标 mapStyle: "amap://styles/blue", //设置地图的显示款式 }); },4.获取轨迹数据 // 获取后盾数据 getPokylineData() { let param = { siteMn: this.siteObj.siteMn, }; this.clearPolyline(); // 革除轨迹 mapPolyline .getCarTrajectory(Object.assign(param, this.searchForm)) .then((res) => { if (res.code == 0) { let data = res.data; if (Object.keys(data).length > 0) { let polylineData = data; this.setPolyline(polylineData); // 依据数据配置轨迹参数 } else { this.$Message.warning("暂无轨迹数据!"); } } }); },5.解决后盾返回的轨迹数据 ...

October 22, 2021 · 2 min · jiezi

关于vue.js:vue2中-thisemit的用法

<template> <el-dialog title="申请新性能" :visible.sync="applyItemVisible" :before-close="hideApplyItem" width="750px" v-if="applyItemVisible" > <el-form label-width="100px" :ref="pageName" :rules="rules" :model="applyItem" :validate-on-rule-change="false" > <el-form-item label="申请新性能" prop="items"> <el-checkbox-group v-model="applyItem.items"> <el-checkbox v-for="(item, key) in options.webConfigKV.item" :label="key" :key="key" :disabled="buyItems.includes(key)" >{{ item }}</el-checkbox > </el-checkbox-group> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="hideApplyItem">取 消</el-button> <el-button type="primary" @click="save" :disabled="btnDisabled" >确 定</el-button > </div> </el-dialog></template><script>import { ProductApi } from "@product/api/index";import { Rules } from "@product/mixin/rules";export default { name: "ApplyItem", mixins: [Rules], props: { applyItemVisible: { type: Boolean, }, options: {}, buyItems: { type: Array, }, }, data() { return { pageName: "applyItem", tips: false, btnDisabled: false, applyItem: { items: [], }, rulesInfo: { items: "请抉择须要申请的性能", }, }; }, methods: { hideApplyItem() { this.$emit("hide"); }, save() { if (!this.checkRules()) return false; ProductApi.applyItem .apply({ ...this.applyItem }) .then((res) => { if (res.status == "200") { let result = res.result; this.$message.success("申请胜利!"); this.hideApplyItem(); } }) .finally(() => { this.btnDisabled = false; }); }, }, mounted() { this.setRules(); },};</script> ...

October 21, 2021 · 1 min · jiezi

关于vue.js:vueaxios基础与应用

aixos根底与利用Axios是一个基于promise的HTTP库,能够用在浏览器和node.js中 咱们先实现axios在Vue中发动一个申请再具体解说它 在vue中应用axios.get()axios概述与配置axios上的办法在Vue中应用axios.get()//装置axiosnpm i axios//在store的actons中发动申请import axios from 'axios'export const data = { namespaced: true, actions: { getData({ commit }, url) { axios.get(url) .then(res => { console.log(res.data); commit('GETDATA', res.data) }) } }, mutations: { GETDATA(state, data) { state.student = data } }, state: { student: '' }}//在组件中dispatch<template> <div id="app"> <button @click="getStudent">申请数据</button> <span>{{ student }}</span> </div></template><script>import { mapActions } from "vuex";import { mapState } from "vuex";export default { name: "App", computed: { ...mapState("data", ["student"]), }, methods: { getStudent() { this.getData("http://localhost:8848"); }, ...mapActions("data", ["getData"]), },};</script>axios.get(url)有点像fetch()办法,返回一个Promise,而后进行后续的链式解决申请返回的内容2 概述个性 ...

October 21, 2021 · 2 min · jiezi

关于vue.js:vue3中清空input-typefile上传文件

1、增加ref<input type="file" ref="uploadFile" /> 2、获取input file...setup () {let uploadFile = ref('uploadFile')return { uploadFile}3、执行清空操作setup () {... const clearInput = () => { uploadFile.value.value = '' }...}

October 21, 2021 · 1 min · jiezi

关于vue.js:vuex的使用

构造介绍public:搁置一下公共文件src:我的项目的次要构造放在这个里边 assets:公共的款式,图片文件common:公共的js文件,内部引入js文件components:我的项目要的次要页面组件locales:语言包(可换地位:比方放到assets中)vuex:我的项目状态集中管理APP.vue:我的项目主页面main.js:我的项目主函数router.js:路由文件其余文件可依据我的项目需要增删 vuex应用type.js:次要用来寄存mutations办法中的常量store.js:vuex的状态集中管理文件modules:寄存各个组件的状态树 store.js import Vue from 'vue';import Vuex from 'vuex';import VuexPersist from 'vuex-persist';import login from './modules/login';import element from './modules/element';import tree from './modules/tree';import editChart from './modules/editChart';import datasource from './modules/datasource';import upload from './modules/upload';import tabledrag from './modules/tabledrag';import permission from './modules/permission';import controlCenter from './modules/controlCenter';import editScreen from './modules/editScreen';import fullpage from './modules/fullpage';import template from './modules/template';import filter from './modules/filter';import linkage from './modules/linkage';import bigScreen from './modules/bigScreen';import dataSync from './modules/dataSync';import targetManage from './modules/targetManage';import fastAnaysis from './modules/fastAnaysis';import permissionNew from './modules/permissionNew';import sqlModel from './modules/sqlModel';Vue.use(Vuex);const vuexLocal = new VuexPersist({ storage: window.sessionStorage, modules: ['sqlModel']});const store = new Vuex.Store({ modules: { login, element, tree, editChart, upload, tabledrag, template, datasource, permission, controlCenter, editScreen, fullpage, bigScreen, dataSync, filter, linkage, targetManage, fastAnaysis, permissionNew, sqlModel }, plugins: [vuexLocal.plugin] // strict: process.env.NODE_ENV !== 'production'});export default store;type.js ...

October 21, 2021 · 3 min · jiezi

关于vue.js:JS根据传入参数替换字符内指定位置的值

(可用于身份证或手机号暗藏局部数字)/** * @description 替换字符串内指定地位的值 * @param {Number|String} startPosition - 开始地位 * @param {Number|String} endPosition - 完结地位-该地位文本不做替换操作 * @param {String} originStr - 原始文本 * @param {String} replaceStr - 替换文本 * @return {String} */function replaceStr({ startPosition = 0, endPosition = 0, originStr = "", replaceStr = "",}) { if (originStr === "") { throw new TypeError("请传入无效文本!"); } if (typeof startPosition !== "number") { startPosition = Number(startPosition); } if (typeof endPosition !== "number") { endPosition = Number(endPosition); } if (typeof originStr !== "string") { originStr += ""; } if (typeof replaceStr !== "string") { replaceStr += ""; } let finalStr = ""; const repeatStrLength = endPosition - startPosition; const middleStr = "".padEnd(repeatStrLength, replaceStr); finalStr = `${originStr.slice(0, startPosition)}${middleStr}${originStr.slice( endPosition )}`; return finalStr;}// democonst str = "helloworld";const replaceStr = replaceStr({ startPosition: 2, endPosition: 5, originStr: str, replaceStr: "*",});console.log(replaceStr); //"he***world"

October 20, 2021 · 1 min · jiezi

关于vue.js:关于vanpullrefresh与vanlist一起用的问题稳定实践

point滚动到底部,不请求分页数据?查看是否正确设置finished值正确设置finished值,请求分页也失常,但还是会呈现刚加载页面的时候屡次调用van-list的load办法,申请完了所有数据?设置:immediate-check="false"就ok实际与讲解// html<van-pull-refresh v-model="refreshing" @refresh="onRefresh"> <van-list class="order-list" v-model="loading" :finished="finished" <--- 这个能够解决正确设置finished后还是会一次性申请完所有数据的问题 ---> :immediate-check="false" finished-text="没有更多了" @load="onLoad"<--- 这个是我本人封装的自定义组件 ---> <order-card v-for="item in records" :key="item.id + item.no" :record="item" @click.native="goTo(item)" ></order-card> </van-list></van-pull-refresh>// jscreated() { this.onLoad(); // 因为设置了immediate-check="false"所以加载完页面后要手动调用第一次的onLoad办法},onRefresh() { // 清空列表数据 this.finished = false; // 重置分页 this.pageParams.pageNo = 0; this.pageParams.pageSize = 10; // 重置列表 this.records = []; // 从新加载数据 // 将 loading 设置为 true,示意处于加载状态 this.loading = true; this.onLoad();},async onLoad() { if (this.refreshing) { this.refreshing = false; } this.pageParams.pageNo++; await this.queryTaskOrderList(); this.loading = false;},async queryTaskOrderList() { try { const params = { ...this.pageParams, }; const apiName = "nptTaskPageByCurrentUser"; const { data: { records, total }, } = await api.req(params, apiName); this.records = this.records.concat(records); // 这里要扭转list this.finished = this.records.length >= total // 就是这里!当申请完所有数据的时候才设置finished为true,否则为false } catch (error) { console.log("获取工作工单列表失败", error); this.finished = true // 还有这里!出错的时候要设置为true,不然也会始终申请 }},

October 20, 2021 · 1 min · jiezi

关于vue.js:Vue-如何快速实现头像裁剪方法比你想象的简单

高效实现需求的办法,就是防止反复造轮子。图片裁剪的插件也不少,这里我抉择 vue-cropper,起因是功能强大、简略易上手。话不多说,上效果图: 效果图 装置npm install vue-cropper应用import { VueCropper } from 'vue-cropper'代码实现以 element-ui + vue-cropper 为例实现头像裁剪 src/App.vue <template> <div> <el-button @click="dialogVisible = true">上传头像</el-button> <avatar-cropper :dialogVisible.sync="dialogVisible" @closeAvatarDialog="closeAvatarDialog"></avatar-cropper> </div></template><script> import avatarCropper from '@/components/avatarCropper' export default { components: { avatarCropper }, data() { return { dialogVisible: false } }, methods: { closeAvatarDialog(data) { console.log(data) this.dialogVisible = false } } }</script>src/components/avatarCropper.vue <template> <el-dialog title="裁剪头像" :visible.sync="dialogVisible" :show-close="false" :close-on-click-modal="false" :close-on-press-escape="false" @close="closeDialog" width="600px" > <div class="avatar-container"> <!-- 待上传图片 --> <div v-show="!options.img"> <el-upload class="upload" ref="upload" action="" :on-change="upload" accept="image/png, image/jpeg, image/jpg" :show-file-list="false" :auto-upload="false" > <el-button slot="trigger" size="small" type="primary" ref="uploadBtn"> 抉择图片 </el-button> </el-upload> <div>反对jpg、png格局的图片,大小不超过5M</div> </div> <!-- 已上传图片 --> <div v-show="options.img" class="avatar-crop"> <vueCropper v-if="dialogVisible" class="crop-box" ref="cropper" :img="options.img" :autoCrop="options.autoCrop" :fixedBox="options.fixedBox" :canMoveBox="options.canMoveBox" :autoCropWidth="options.autoCropWidth" :autoCropHeight="options.autoCropHeight" :centerBox="options.centerBox" :fixed="options.fixed" :fixedNumber="options.fixedNumber" :canMove="options.canMove" :canScale="options.canScale" ></vueCropper> </div> </div> <span slot="footer" class="dialog-footer"> <div class="reupload" @click="reupload"> <span v-show="options.img">从新上传</span> </div> <div> <el-button @click="closeDialog">取 消</el-button> <el-button type="primary" @click="getCrop">确 定</el-button> </div> </span> </el-dialog></template><script>import { VueCropper } from 'vue-cropper'export default { components: { VueCropper }, name: 'avatarCropper', props: { dialogVisible: { type: Boolean, default: false } }, data() { return { // vueCropper组件 裁剪配置信息 options: { img: '', // 原图文件 autoCrop: true, // 默认生成截图框 fixedBox: false, // 固定截图框大小 canMoveBox: true, // 截图框能够拖动 autoCropWidth: 200, // 截图框宽度 autoCropHeight: 200, // 截图框高度 fixed: true, // 截图框宽高固定比例 fixedNumber: [1, 1], // 截图框的宽高比例 centerBox: true, // 截图框被限度在图片外面 canMove: false, // 上传图片不容许拖动 canScale: false // 上传图片不容许滚轮缩放 } } }, methods: { // 读取原图 upload(file) { const isIMAGE = file.raw.type === 'image/jpeg' || file.raw.type === 'image/png' const isLt5M = file.raw.size / 1024 / 1024 < 5 if (!isIMAGE) { this.$message({ showClose: true, message: '请抉择 jpg、png 格局的图片', type: 'warning' }) return false } if (!isLt5M) { this.$message({ showClose: true, message: '图片大小不能超过 5MB', type: 'warning' }) return false } let reader = new FileReader() reader.readAsDataURL(file.raw) reader.onload = e => { this.options.img = e.target.result // base64 } }, // 获取截图信息 getCrop() { // 获取截图的 base64 数据 // this.$refs.cropper.getCropData((data) => { // this.$emit('closeAvatarDialog', data) // this.closeDialog() // }); // 获取截图的 blob 数据 this.$refs.cropper.getCropBlob(data => { this.$emit('closeAvatarDialog', data) this.closeDialog() }) }, // 从新上传 reupload() { this.$refs.uploadBtn.$el.click() }, // 敞开弹框 closeDialog() { this.$emit('update:dialogVisible', false) this.options.img = '' } }}</script><style lang="scss" scoped>.dialog-footer { display: flex; justify-content: space-between; align-items: center; font-size: 14px; .reupload { color: #409eff; cursor: pointer; }}.avatar-container { display: flex; justify-content: center; align-items: center; width: 560px; height: 400px; background-color: #f0f2f5; margin-right: 10px; border-radius: 4px; .upload { text-align: center; margin-bottom: 24px; } .avatar-crop { width: 560px; height: 400px; position: relative; .crop-box { width: 100%; height: 100%; border-radius: 4px; overflow: hidden; } }}</style>总结裁剪实现之后能够获取到 base64 和 blob 数据,而后上传至后端。vue-cropper 还有泛滥属性和办法,用起来都很不便,有趣味的同学能够实现一下实时预览。 ...

October 20, 2021 · 2 min · jiezi

关于vue.js:Nuxt如何使用scss预编译器

写在后面网上看了一堆文章,乌七八糟的坑,最初也没搞进去,最初本人参考官网文档搞进去了。 官网文档:https://www.nuxtjs.cn/faq/pre...上面是我本人摸索进去的步骤: 第1步批改package.json文件:很奇怪,间接不加版本号装置的版本12.1.0常常用起来爆错,网上好多文章也说版本太高的问题,我始终用的这个版本,感觉不错。 "dependencies": { "@nuxtjs/style-resources": "^1.2.1", "core-js": "^3.15.1", "element-ui": "^2.15.2", "nuxt": "^2.15.7" }, "devDependencies": { "node-sass": "^4.12.0", "sass-loader": "^7.1.0" }话说应该也能够放到这里,能够试试 "dependencies": { "@nuxtjs/style-resources": "^1.2.1", "core-js": "^3.15.1", "element-ui": "^2.15.2", "nuxt": "^2.15.7", "node-sass": "^4.12.0", "sass-loader": "^7.1.0" }, "devDependencies": { }第2步批改nuxt.config.js的css数组如下: // Global CSS: https://go.nuxtjs.dev/config-css css: [ 'element-ui/lib/theme-chalk/index.css',//这是饿了么组件库的,不必管 //上面这两个是scss用失去的 // 间接加载一个 Node.js 模块。(在这里它是一个 Sass 文件) // 我的项目里要用的 CSS 文件 '@/assets/css/main.css', // 我的项目里要应用的 SCSS 文件 '@/assets/css/main.scss' ],第3步 创立assets目录和css目录,并创立空文件夹 第4步 在style里加货色就能够应用了<style lang="scss" scoped>div{ color: red;}</style>

October 19, 2021 · 1 min · jiezi

关于vue.js:前端vue学习vuecli安装

1.装置nodejswww.nodejs.cn下载nodejs2.npmnpm是nodejs的包管理器,cnpm是(淘宝)国内镜像的(区别:抉择下载的站点不同)cnpm装置:npm install -g cnpm --registry=http://registry.npm.taobao.orgnpm root -g查看全局装置的文件夹地位3.vue-cli2装置npm install vue-cli -gnpm install -g @vue/cli 或者cnpm install -g @vue/cli(vue-cli3装置)npm install -gd express --registry=http://registry.npm.taobao.org(npm config set registry http://registry.npm.taobao.org)(npm init -f(在本地装置失败的状况下,须要初始化本地环境配置))npm config get registry 获取镜像配置装置报错:npm cache clean --forcenpm install -g npm@latest (npm 更新到最新版本)npm install -g cnpm --registry=https://registry.npm.taobao.orgnpm cache verifyhar-validator@5.1.2 Not found问题删除package-lock.json文件,从新应用npm i即可4.新建一个我的项目: vue-cli3 npm i -g @vue/cli-init 1). vue init webpack projectName ,cd projectName ,npm run dev 2). vue create projectName,cd projectName,npm run serve5.增加elementvue add elementnpm run build 编译生成dist文件

October 19, 2021 · 1 min · jiezi

关于vue.js:LessSass安装

1.less1.装置1.如果没有装置less,请先装置lessnpm i less-loader less --save-dev2.如果须要定义全局变量,请装置npm i style-resources-loader --save-dev3.在我的项目根目录(src同级)创立vue.config.js并配置 const path = require('path')function resolve (dir) {return path.join(__dirname, dir)}module.exports = {pluginOptions: { //第三方插件配置'style-resources-loader': {preProcessor: 'less',patterns:[(, './src/assets/styles/vars.less')] //该地址为你的全局款式地址}}}2.应用// vars.less@my-bg-color: #f5f5f5;@my-theme-color: #F04846;// 页面.my-header{background: @my-theme-color;}提醒:如果,发现页面引入始终报错,说找不到或者不存在,或者定义有效,那么再去装置一下 npm i vue-cli-plugin-style-resources-loader --save-dev失常状况下装置style-resources-loader时,vue-cli-plugin-style-resources-loader应该会一起装置了,不过有时候非凡起因导致vue-cli-plugin-style-resources-loader装置失败,所以会包这个错。装置完重启就能够用了。 2.scss2.1 装置npm i node-sass@4.14.1npm i sass-loader@7 -Dnpm i style-loader -D2.2 vue.config.js//vue-loader页面module.exports = { module: { rules: [ // ... 疏忽其它规定 // 一般的 `.scss` 文件和 `*.vue` 文件中的 // `<style lang="scss">` 块都利用它 { test: /\.scss$/, use: [ 'vue-style-loader', 'css-loader', 'sass-loader' ] } ] }, // 插件疏忽}

October 17, 2021 · 1 min · jiezi

关于vue.js:前端面试每日-31-第914天

明天的知识点 (2021.10.14) —— 第914天 (我也要出题)[html] 应用H5做一个能够多选的select组件[css] 应用纯css3画一个火箭的模型[js] ES6中class继承为什么肯定要写super()?super代表什么?[软技能] 你晓得网上的文库实现的原理吗?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

October 17, 2021 · 1 min · jiezi

关于vue.js:vue30-自定义事件

一、自定义事件实现验证抛出事件咱们写一个自定义事件、该事件旨在创立一个流动。假如咱们的邮箱和明码是必填项。咱们通过自定义事件在验证完邮箱和明码之后将form表单数据传递给父组件。 页面成果如下: <custom-form @submit="submitData"></custom-form>咱们最终想要的成果是想要在数据验证通过在父组件中调用submitData办法,从而进行提交。当初咱们把焦点聚焦在custom-form组件中。以下是custom-form组件的具体实现代码: <template> <el-form ref="form" :model="form" label-width="80px"> <el-form-item label="流动名称"> <el-input v-model="form.name"></el-input> </el-form-item> <el-form-item label="邮箱"> <el-input v-model="form.email"></el-input> </el-form-item> <el-form-item label="明码"> <el-input type="password" v-model="form.password"></el-input> </el-form-item> <el-form-item label="流动区域"> <el-select v-model="form.region" placeholder="请抉择流动区域"> <el-option label="区域一" value="shanghai"></el-option> <el-option label="区域二" value="beijing"></el-option> </el-select> </el-form-item> <el-form-item label="流动工夫"> <el-col :span="11"> <el-date-picker type="date" placeholder="抉择日期" v-model="form.date1" style="width: 100%"></el-date-picker> </el-col> <el-col class="line" :span="2">-</el-col> <el-col :span="11"> <el-time-picker placeholder="抉择工夫" v-model="form.date2" style="width: 100%"></el-time-picker> </el-col> </el-form-item> <el-form-item label="即时配送"> <el-switch v-model="form.delivery"></el-switch> </el-form-item> <el-form-item label="流动性质"> <el-checkbox-group v-model="form.type"> <el-checkbox label="美食/餐厅线上流动" name="type"></el-checkbox> <el-checkbox label="地推流动" name="type"></el-checkbox> <el-checkbox label="线下主题流动" name="type"></el-checkbox> <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox> </el-checkbox-group> </el-form-item> <el-form-item label="非凡资源"> <el-radio-group v-model="form.resource"> <el-radio label="线上品牌商资助"></el-radio> <el-radio label="线下场地收费"></el-radio> </el-radio-group> </el-form-item> <el-form-item label="流动模式"> <el-input type="textarea" v-model="form.desc"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm(form.email, form.password)">立刻创立</el-button> <el-button>勾销</el-button> </el-form-item> </el-form></template><script> import { ElMessage } from 'element-plus' export default { data() { return { form: { name: '', region: '', date1: '', date2: '', delivery: false, type: [], resource: '', desc: '', email: 'xxx@163.com', password: '', }, } }, methods: { submitForm(email, password) { this.$emit('submit', { email, password }) }, }, emits: { click: null, submit: ({ email, password }) => { if (email && password) { return true } else { ElMessage({ message: 'Invalid submit event payload!', type: 'warning', }) return false } }, }, }</script>咱们应用email和password进行邮箱和明码输出值的绑定。同时在点击立刻创立按钮时调用submit先进行数据校验。待数据校验通过当前,再将数据传递给父组件进行提交操作。 ...

October 15, 2021 · 2 min · jiezi

关于vue.js:ViteElectron快速构建一个VUE3桌面应用

一. 简介首先,介绍下vite和Electron。 Vite是一种新型前端构建工具,可能显著晋升前端开发体验。由尤大推出,其发动静示意“再也回不去webpack了...”Electron是一个应用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入Chromium和Node.js到二进制的 Electron 容许您放弃一个 JavaScript 代码代码库并创立 在Windows上运行的跨平台利用 macOS和Linux——不须要本地开发 教训。当开始想用vue去开发一个桌面利用时,首先去搜寻下,理解到以后如下两种现成计划: electron-vue: 该我的项目集成度较好,封装较为残缺,中文搜索下来文章较多也是该计划,能够间接上手去应用。然而,问题在于其内置electron的版本太低,写文章时看到的版本是2.0.4,而最新的electron版本是15.1.2。Vue CLI Plugin Electron Builder: 该计划是集成到到vue-cli中应用,应用vue add electron-builder后可间接上手,免去了根底配置的步骤。然而其只能在vue-cli下应用,无奈配合vite来应用。因而,若要应用vite和electron,还须要本人来配置。 二. 创立一个Vite我的项目1. 装置 viteyarn create vite2. 创立我的项目创立命令如下: yarn create vite <your-vue-app-name> --template vue此处创立一个我的项目,名为kuari。 yarn create vite kuari --template vue3. 进入且运行进入我的项目,在运行前须要先装置下依赖。 cd kuariyarn installyarn dev在运行命令敲下的一瞬间,简直是曾经在运行了,不愧是vite。此时依照输入,关上地址预览,即可看到初始化页面。 至此一个根底的vite我的项目创立实现。 三. 配置Electron1. 官网文档在Electron官网的疾速入门文档中,有官网给出的利用html、javascript、css来创立一个electron利用的案例,vite+electron的计划也借鉴其中。 2. 装置首先装置electron至vite利用。目前electron的版本为^15.1.2,。 yarn add --dev electron3. 配置文件1)vite.config.jsimport { defineConfig } from 'vite'import vue from '@vitejs/plugin-vue'import path from 'path' // 新增// https://vitejs.dev/config/export default defineConfig({ base: path.resolve(__dirname, './dist/'), // 新增 plugins: [vue()]})2)main.js创立一个新的文件main.js,须要留神的是,该内容中index.html的加载门路跟electron官网给的配置不同。 ...

October 14, 2021 · 2 min · jiezi

关于vue.js:在Vue中使用JSX很easy的

摘要:JSX 是一种 Javascript 的语法扩大,JSX = Javascript + XML,即在 Javascript 外面写 XML,因为 JSX 的这个个性,所以他即具备了 Javascript 的灵活性,同时又兼具 html 的语义化和直观性。本文分享自华为云社区《在 Vue 中如何应用 JSX,就这么简略!【倡议珍藏】》,作者:纸飞机 。 JSX是什么JSX 是一种 Javascript 的语法扩大,JSX = Javascript + XML,即在 Javascript 外面写 XML,因为 JSX 的这个个性,所以他即具备了 Javascript 的灵活性,同时又兼具 html 的语义化和直观性。(集体倡议灵便度强的局部组件能够用JSX来代替,整个我的项目JSX属实没必要) XML学习地址(学与不学可随便,理解就ok):https://www.w3school.com.cn/x...用template的弊病:https://www.mk2048.com/blog/b... 为什么要在 Vue 中应用 JSX有时候,咱们应用渲染函数(render function)来形象组件,渲染函数不是很分明的参见官网文档, 而渲染函数有时候写起来是十分苦楚的,所以只须要有个理解。 渲染函数:https://cn.vuejs.org/v2/guide... createElement( 'anchored-heading', { props: { level: 1 } }, [ createElement('span', 'Hello'), ' world!' ])其对应的模板是上面: <anchored-heading :level="1"> <span>Hello</span> world!</anchored-heading>你看这写起来多吃力,这个时候就派上 JSX 上场了。在 Vue 中应用 JSX,须要应用 Babel 插件,它能够让咱们回到更靠近于模板的语法上,接下来就让咱们一起开始在 Vue 中写 JSX 吧。 ...

October 14, 2021 · 4 min · jiezi

关于vue.js:Vue安装和卸载

// 卸载之前版本npm uninstall vue-cli -g 或 yarn global remove vue-cli// 装置最新版本 npm install -g @vue/cli或 yarn global add @vue/cli//查看vue --version或vue -V创立一个新我的项目: vue-cli3疾速创立我的项目`1: vue create my-project 前两项都是你此前保留的设置,是我之前保留的预设配置。现在就能够间接应用了。如果没有配置保留过,能够抉择Manually select features 应用高低键配合 空格选中 ? Check the features needed for your project: (Press <space> to select, <a> to toggle all, <i> to invert selection) 2 >( ) Babel //转码器,能够将ES6代码转为ES5代码,从而在现有环境执行。 3 ( ) TypeScript// TypeScript是一个JavaScript(后缀.js)的超集(后缀.ts)蕴含并扩大了 JavaScript 的语法,须要被编译输入为 JavaScript在浏览器运行,目前较少人再用 4 ( ) Progressive Web App (PWA) Support// 渐进式Web应用程序 5 ( ) Router // vue-router(vue路由) 6 ( ) Vuex // vuex(vue的状态管理模式) 7 ( ) CSS Pre-processors // CSS 预处理器(如:less、sass) 8 ( ) Linter / Formatter // 代码格调检查和格式化(如:ESlint) 9 ( ) Unit Testing // 单元测试(unit tests)10 ( ) E2E Testing // e2e(end to end) 测试2: 这里询问的是 是否应用class格调的组件语法,如果在我的项目中想要放弃应用Typescript的class格调的话,倡议大家抉择y ...

October 13, 2021 · 1 min · jiezi

关于vue.js:vue开发技巧

1. 将一个 prop 限度在一个类型的列表中应用 prop 定义中的 validator 选项,能够将一个 prop 类型限度在一组特定的值中。 export default { name: 'Image', props: { src: { type: String, }, style: { type: String, validator: s => ['square', 'rounded'].includes(s) } }};这个验证函数承受一个prop,如果prop无效或有效,则返回true或false。 当单单传入的 true 或 false 来管制某些条件不能满足需要时,我通常应用这个办法来做。 按钮类型或正告类型(信息、胜利、危险、正告)是最常见的用法、、。色彩也是一个很好的用处。 2. 默认内容和扩大点Vue中的槽能够有默认的内容,这使咱们能够制作出更容易应用的组件。 <button class="button" @click="$emit('click')"> <slot> <!-- Used if no slot is provided --> Click me </slot></button我最喜爱应用默认槽,就是用它们来创立扩大点。 咱们能够取组件的任何局部,将其封装在一个插槽中,在里面咱们能够用想要的任何内容笼罩组件的该局部。默认状况下,它依然会依照原来的形式工作,但这样做会有了更多的选项 <template> <button class="button" @click="$emit('click')"> <slot> <div class="formatting"> {{ text }} </div> </slot> </button></template>当初咱们能够用许多不同的形式应用这个组件。简略的、默认的形式,或者自定义的形式。 <!-- Uses default functionality of the component --><ButtonWithExtensionPoint text="Formatted text" /><ButtonWithExtensionPoint> <div class="different-formatting"> Do something a little different here </div></ButtonWithExtensionPoint>3. 应用引号来监听嵌套属性你可能不晓得这一点,咱们能够通过应用引号轻松地间接监听嵌套值: ...

October 13, 2021 · 4 min · jiezi

关于vue.js:使用elementui在完成项目中遇到的未知知识点2

{ required: true, validator: validatePhone, trigger: "blur", },trigger的意思是当失去焦点时触发,例如呈现红色的框 <el-pagination:current-page="page.start":page-size="page.pageSize":total="page.total"@current-change="handleCurrentChange"class="main-body-table-page"layout="total, prev, pager, next, jumper"></el-pagination>el-pagination指的是分页,一个表格的数据过多,能够应用分页的成果来进行跳转外面的api别离是 :current-page是指当前页的成果,:page-size指的是下拉框显示当前页显示多少条数据,:total指的是一共有多少的分页 created() { this.leftTableStyle = "{ width: 100%; height: " + (document.documentElement.clientHeight - 350) + "px;}"; this.heightValue = document.documentElement.clientHeigh - 350 + "px"; //页面加载即申请 // this.search(); }这里是调用了leftTableStyle办法,次要就是表格须要减去350px的高度,间接操作DOM上的数据,外面用到了clientHeight这个api,不太理解,所以去查问了一下百度,得悉:clientHeight少数指的是视口的高度,scrollHeight指的是蕴含滚动内容的元素大小,offsetHeight指的是偏移量 <el-select v-model="warehousingConditions.passportType" @change="passPortButt" clearable filterable placeholder="请抉择要入库的证照类型"><el-option v-for="item in passportType" :key="item.hardcode" :label="item.dictname" :value="item.hardcode"></el-option></el-select>外面的属性filterable是指可搜寻的,默认值是false,fliter-method接管一个办法,当搜寻关键字变动时,会将以后的关键字和数据项传给该办法。若办法返回true,则会在搜寻后果中显示相应的数据项 this.$confirm( "确定入库:&nbsp;&nbsp;" + startNum + "-" + endNum + "&nbsp;&nbsp;号段吗?", "提醒", { confirmButtonText: "确定", cancelButtonText: "勾销", dangerouslyUseHTMLString: true, type: "warning", } ) .then(() => { let params = this.warehousingConditions; this.warehousingLoading = true; delete params.submitLevelOption; licenceWarehousing(params) .then((response) => { this.warehousingLoading = false; if (response.code === 20000) { this.loadData(); this.$message({ message: "入库胜利", type: "success", }); return; } }) .catch((err) => { this.warehousingLoading = false; console.log(err); }); })这里应用的是elementui的确认音讯的全局对话框,调用$confirm办法来关上音讯提醒,这里采纳promise来解决后续响应 ...

October 13, 2021 · 1 min · jiezi

关于vue.js:使用ESLintPrettier来统一前端代码风格

在团队的我的项目开发过程中,代码保护所占的工夫比重往往大于新性能的开发。因而编写合乎团队编码标准的代码是至关重要的,这样做不仅能够很大水平地防止根本语法错误,也保障了代码的可读性。解决办法应用 eslint 查看代码应用 prettier 格式化代码应用办法(1)首先装置Eslint: npm install eslint --save-dev新建.eslintrc.js文件,上面是我的配置: module.exports = { env: { browser: true, es2021: true, }, extends: [ "eslint:recommended", "plugin:prettier/recommended", ], parserOptions: { ecmaVersion: 12, parser: 'babel-eslint', sourceType: "module", }, plugins: ["prettier"], rules: { "prettier/prettier": "error", },};(2)装置Prettier: npm install --save-dev --save-exact prettier新建.prettierrc.js文件,上面是我的配置: module.exports = { // 一行最多 200 字符 printWidth: 200, // 应用 2 个空格缩进 tabWidth: 4, // 不应用缩进符,而应用空格 useTabs: false, // 行尾不须要分号 semi: false, // 应用单引号 singleQuote: true, // 对象的 key 仅在必要时用引号 quoteProps: 'as-needed', // jsx 不应用单引号,而应用双引号 jsxSingleQuote: false, // 开端不须要逗号 trailingComma: 'none', // 大括号内的首尾须要空格 bracketSpacing: true, // jsx 标签的反尖括号不须要换行 jsxBracketSameLine: true, // 箭头函数,只有一个参数的时候,也须要括号 arrowParens: 'always', // 每个文件格式化的范畴是文件的全部内容 rangeStart: 0, rangeEnd: Infinity, // 不须要写文件结尾的 @prettier requirePragma: false, // 不须要主动在文件结尾插入 @prettier insertPragma: false, // 应用默认的折行规范 proseWrap: 'preserve', // 依据显示款式决定 html 要不要折行 htmlWhitespaceSensitivity: 'css', endOfLine: 'lf', extends: ['plugin:prettier/recommended', 'prettier/flowtype', 'prettier/vue']}

October 13, 2021 · 1 min · jiezi

关于vue.js:vue面试疑难杂症

1.https://www.cnblogs.com/skywi...注: Vue.js 3.0 放弃defineProperty, 应用Proxy的起因过滤器 (Filter)作用在组件上, 实质是一个父子组件通信的语法糖,通过prop和$.emit实现, 等同于:value="message" @input=" $emit('input', $event.target.value)"vue-routerVue.mixin的应用场景和原理?Vuex

October 12, 2021 · 1 min · jiezi

关于vue.js:vue父子组件数据传递props中Object和Array如何设置默认值

vue中父子组件进行数据传递,应用props将父组件的数据传递给子组件。咱们晓得能够应用两种写法:第一种就是应用数组的形式,例如:props: ['list', 'nameObj']这种形式,咱们无奈晓得传递的数据的类型,简单我的项目应用起来就不是那么的不便。 第二种就是应用对象的形式,指明传递的数据的类型以及默认值。例如: props: { field: { type: String }, index: { type: Number, default: 0 }, isAble: { type: Boolean, default: true }, rowData: { type: Object, default: function () { return {}; } }, btnArr: { type: Array, default: function () { return []; } }}这种形式高深莫测,所以我的项目常常应用这种形式进行数据传递。对于简略的数据类型,间接列出数据类型和默认值(default)。对于简单数据类型Object和Array,设置默认值的时候须要通过函数的形式进行返回。以下两种形式都是正确的: rowData: { type: Object, default() { return {} }}rowData: { type: Object, default: function () { return {} }}特地留神一点,这里不能简化成箭头函数: // 这种写法是谬误的// 当父组件没有传这个值或者值是空时,输入的话,这时是返回underfind,在template中获取外面的值时,就报错rowData: { type: Object, default: () => {}}

October 12, 2021 · 1 min · jiezi

关于vue.js:vue高阶组件

高阶组件就是 一个函数承受一个纯对象,并且返回一个新纯对象高阶组件:console.js function Console (Base) { return { mounted () { console.log('haha') }, props: Base.props, render (h) { const slots = Object.keys(this.$slots) .reduce((arr, key) => arr.concat(this.$slots[key]), []) // 手动更正 context .map(vnode => { vnode.context = this._self //绑定到高阶组件上 return vnode }) return h(WrappedComponent, { on: this.$listeners, props: this.$props, attrs: this.$attrs }, slots) } }}高阶组件应用: <template> <div> <span @click="handleClick">props: {{test}}</span> <slot name="slot1"/> <!-- 具名插槽 --></slot> <p>===========</p> <slot><slot/> <!-- 默认插槽 --> </div></template> <script>export default { ...}</script><template> <div> <Base> <h2 slot="slot1">BaseComponent slot</h2> <p>default slot</p> </Base> <wrapBase> <h2 slot="slot1">EnhancedComponent slot</h2> <p>default slot</p> </wrapBase> </div></template> <script> import Base from './Base.vue' import hoc from './Console.js' const wrapBase = Console(Base) export default { components: { Base, wrapBase } }</script>

October 12, 2021 · 1 min · jiezi

关于vue.js:vue-200知识点

vue你晓得vue的模板语法用的是哪个web模板引擎的吗?说说你对这模板引擎的了解你晓得v-model的原理吗?说说看你有应用过vue开发多语言我的项目吗?说说你的做法?在应用计算属性的时,函数名和data数据源中的数据能够同名吗?vue中data的属性能够和methods中的办法同名吗?为什么?怎么给vue定义全局的办法?vue2.0不再反对v-html中应用过滤器了怎么办?怎么解决vue打包后动态资源图片生效的问题?怎么解决vue动静设置img的src不失效的问题?应用vue后怎么针对搜索引擎做SEO优化?跟keep-alive无关的生命周期是哪些?形容下这些生命周期如果当初让你从vue/react/angularjs三个中抉择一个,你会选哪个?说说你的理由你晓得vue2.0兼容IE哪个版本以上吗?应用vue开发一个todo小利用,谈下你的思路你有看过vue举荐的格调指南吗?列举出你晓得的几条你是从vue哪个版本开始用的?你晓得1.x和2.x有什么区别吗?你晓得vue中key的原理吗?说说你对它的了解vue中怎么重置data?vue渲染模板时怎么保留模板中的HTML正文呢?Vue.observable你有理解过吗?说说看你晓得style加scoped属性的用处和原理吗?你期待vue3.0有什么性能或者改良的中央?vue边界状况有哪些?如何在子组件中拜访父组件的实例?watch的属性用箭头函数定义后果会怎么样?在vue我的项目中如果methods的办法用箭头函数定义后果会怎么样?在vue我的项目中如何配置favicon?你有应用过babel-polyfill模块吗?次要是用来做什么的?说说你对vue的错误处理的理解?在vue事件中传入$event,应用e.target和e.currentTarget有什么区别?在.vue文件中style是必须的吗?那script是必须的吗?为什么?vue怎么实现强制刷新组件?vue自定义事件中父组件怎么接管子组件的多个参数?理论工作中,你总结的vue最佳实际有哪些?vue给组件绑定自定义事件有效怎么解决?vue的属性名称与method的办法名称一样时会产生什么问题?vue变量名如果以_、$结尾的属性会产生什么问题?怎么拜访到它们的值?vue应用v-for遍历对象时,是按什么程序遍历的?如何保障程序?vue如果想扩大某个现有的组件时,怎么做呢?说下attrs和attrs和listeners的应用场景剖析下vue我的项目本地开发实现后部署到服务器后报404是什么起因呢?v-once的应用场景有哪些?说说你对vue的表单修饰符.lazy的了解vue为什么要求组件模板只能有一个根元素?EventBus注册在全局上时,路由切换时会反复触发事件,如何解决呢?怎么批改vue打包后生成文件门路?你有应用做过vue与原生app交互吗?说说vue与ap交互的办法应用vue写一个tab切换vue中什么是递归组件?举个例子阐明下?怎么拜访到子组件的实例或者子元素?在子组件中怎么拜访到父组件的实例?在组件中怎么拜访到根实例?说说你对Object.defineProperty的了解vue组件里写的原生addEventListeners监听事件,要手动去销毁吗?为什么?vue组件里的定时器要怎么销毁?vue组件会在什么时候下被销毁?应用vue渲染大量数据时应该怎么优化?说下你的思路!在vue中应用this应该留神哪些问题?你有应用过JSX吗?说说你对JSX的了解说说组件的命名标准怎么配置使vue2.0+反对TypeScript写法?<template></template>有什么用?vue的is这个个性你有用过吗?次要用在哪些方面?vue的:class和:style有几种示意形式?你理解什么是函数式组件吗?vue怎么扭转插入模板的分隔符?组件中写name选项有什么作用?说说你对provide和inject的了解开发过程中有应用过devtools吗?说说你对slot的了解有多少?slot应用场景有哪些?你有应用过动静组件吗?说说你对它的了解prop验证的type类型有哪几种?prop是怎么做验证的?能够设置默认值吗?怎么缓存以后关上的路由组件,缓存后想更新以后组件怎么办呢?说说你对vue组件的设计准则的了解你理解vue的diff算法吗?vue如何优化首页的加载速度?vue打包成最终的文件有哪些?ajax、fetch、axios这三都有什么区别?vue能监听到数组变动的办法有哪些?为什么这些办法能监听到呢?vue中是如何应用event对象的?vue首页白屏是什么问题引起的?如何解决呢?说说你对单向数据流和双向数据流的了解挪动端ui你用的是哪个ui库?有遇到过什么问题吗?你晓得nextTick的原理吗?说说你对v-clock和v-pre指令的了解写出你晓得的表单修饰符和事件修饰符说说你对proxy的了解你有本人用vue写过UI组件库吗?用vue怎么实现一个换肤的性能?有在vue中应用过echarts吗?踩过哪些坑?如何解决的?如果让你教一个2-3年教训前端教训的共事应用vue,你该怎么教?vue性能的优化的办法有哪些?SSR解决了什么问题?有做过SSR吗?你是怎么做的?说说你感觉认为的vue开发标准有哪些?vue部署上线前须要做哪些筹备工作?vue过渡动画实现的形式有哪些?vue在created和mounted这两个生命周期中申请数据有什么区别呢?vue父子组件双向绑定的办法有哪些?vue怎么获取DOM节点?vue我的项目有做过单元测试吗?vue我的项目有应用过npm run build --report吗?如何解决vue打包vendor过大的问题?webpack打包vue速度太慢怎么办?vue在开发过程中要同时跟N个不同的后端人员联调接口(申请的url不一样)时你该怎么办?vue要做权限治理该怎么做?如果管制到按钮级别的权限怎么做?说下你的vue我的项目的目录构造,如果是大型项目你该怎么划分构造和划分组件呢?在挪动端应用vue,你感觉最佳实际有哪些?你们我的项目为什么会选vue而不抉择其它的框架呢?对于行将到来的vue3.0个性你有什么理解的吗?vue开发过程中你有应用什么辅助工具吗?vue和微信小程序写法上有什么区别?怎么缓存以后的组件?缓存后怎么更新?你理解什么是高阶组件吗?可否举个例子阐明下?为什么咱们写组件的时候能够写在.vue里呢?能够是别的文件名后缀吗?vue-loader是什么?它有什么作用?说说你对vue的extend(结构器)的了解,它次要是用来做什么的?如果将axios异步申请同步化解决?怎么捕捉组件vue的错误信息?为什么vue应用异步更新组件?如何实现一个虚构DOM?说说你的思路写出多种定义组件模板的办法SPA单页面的实现形式有哪些?说说你对SPA单页面的了解,它的优缺点别离是什么?说说你都用vue做过哪些类型的我的项目?在vue我的项目中如何引入第三方库(比方jQuery)?有哪些办法能够做到?应用vue手写一个过滤器你有应用过render函数吗?有什么益处?写出你罕用的指令有哪些?手写一个自定义指令及写出如何调用组件进来申请接口时你是放在哪个生命周期?为什么?你有用过事件总线(EventBus)吗?说说你的了解说说vue的优缺点别离是什么?DOM渲染在哪个周期中就曾经实现了?第一次加载页面时会触发哪几个钩子?vue生命周期总共有几个阶段?vue生命周期的作用是什么?vue和angular有什么区别呢?如何引入scss?引入后如何应用?应用vue开发过程你是怎么做接口治理的?为何官网举荐应用axios而不必vue-resource?你理解axios的原理吗?有看过它的源码吗?你有封装过axios吗?次要是封装哪方面的?如何中断axios的申请?axios是什么?怎么应用它?怎么解决跨域的问题?说说你对vue的template编译的了解?v-on能够绑定多个办法吗?vue罕用的修饰符有哪些?列举并阐明你认为vue的外围是什么?v-model是什么?有什么用呢?说说你对vue的mixin的了解,有什么利用场景?SPA首屏加载速度慢的怎么解决?删除数组用delete和Vue.delete有什么区别?动静给vue的data增加一个新的属性时会产生什么?怎么解决?组件和插件有什么区别?说说你应用vue过程中遇到的问题(坑)有哪些,你是怎么解决的?说说你对选项el,template,render的了解vue实例挂载的过程是什么?vue在组件中引入插件的办法有哪些?v-if和v-for的优先级是什么?如果这两个同时呈现时,那应该怎么优化能力失去更好的性能?别离说说vue能监听到数组或对象变动的场景,还有哪些场景是监听不到的?无奈监听时有什么解决方案?$nextTick有什么作用?为什么data属性必须申明为返回一个初始数据对应的函数呢?怎么在watch监听开始之后立刻被调用?watch怎么深度监听对象变动?watch和计算属性有什么区别?vue如何监听键盘事件?v-for循环中key有什么作用?怎么在vue中应用插件?你有写过自定义组件吗?说说你对keep-alive的了解是什么?怎么使css款式只在以后组件中失效?你有看过vue的源码吗?如果有那就说说看你有写过自定义指令吗?自定义指令的生命周期(钩子函数)有哪些?v-show和v-if有什么区别?应用场景别离是什么?说说你对MVC、MVP、MVVM模式的了解说下你对指令的了解?请形容下vue的生命周期是什么?vue组件之间的通信都有哪些?什么是虚构DOM?什么是双向绑定?原理是什么?vue和react有什么不同?应用场景是什么?说说vue的优缺点有应用过vue吗?说说你对vue的了解 vue-clivue-cli提供了的哪几种脚手架模板?vue-cli工程中罕用的npm命令有哪些?在应用vue-cli开发vue我的项目时,主动刷新页面的原理你理解吗?vue-cli3插件有写过吗?怎么写一个代码生成插件?vue-cli生成的我的项目能够应用es6、es7的语法吗?为什么?vue-cli怎么解决跨域的问题?vue-cli中你常常的加载器有哪些?你晓得什么是脚手架吗?说下你理解的vue-cli原理?你能够本人实现个类vue-cli吗?怎么应用vue-cli3创立一个我的项目?vue-cli3你有应用过吗?它和2.x版本有什么区别?vue-cli默认是单页面的,那要弄成多页面该怎么办呢?不必vue-cli,你本人有搭建过vue的开发环境吗?流程是什么? vue-routervue-router怎么重定向页面?vue-router怎么配置404页面?切换路由时,须要保留草稿的性能,怎么实现呢?vue-router路由有几种模式?说说它们的区别?vue-router有哪几种导航钩子( 导航守卫 )?说说你对router-link的理解vue-router如何响应路由参数的变动?你有看过vue-router的源码吗?说说看切换到新路由时,页面要滚动到顶部或放弃原先的滚动地位怎么做呢?在什么场景下会用到嵌套路由?如何获取路由传过来的参数?说说active-class是哪个组件的属性?在vue组件中怎么获取到以后的路由信息?vur-router怎么重定向?怎么动静加载路由?怎么实现路由懒加载呢?如果让你从零开始写一个vue路由,说说你的思路说说vue-router残缺的导航解析流程是什么?路由之间是怎么跳转的?有哪些形式?如果vue-router应用history模式,部署时要留神什么?route和router有什么区别?vue-router钩子函数有哪些?都有哪些参数?vue-router是用来做什么的?它有哪些组件? vuex你有写过vuex中store的插件吗?你有应用过vuex的module吗?次要是在什么场景下应用?vuex中actions和mutations有什么区别?vuex应用actions时不反对多参数传递怎么办?你感觉vuex有什么毛病?你感觉要是不必vuex的话会带来哪些问题?vuex怎么晓得state是通过mutation批改还是内部间接批改的?申请数据是写在组件的methods中还是在vuex的action中?怎么监听vuex数据的变动?vuex的action和mutation的个性是什么?有什么区别?页面刷新后vuex的state数据失落怎么解决?vuex的state、getter、mutation、action、module个性别离是什么?vuex的store有几个属性值?别离讲讲它们的作用是什么?你了解的vuex是什么呢?哪些场景会用到?不必会有问题吗?有哪些个性?应用vuex的劣势是什么?有用过vuex吗?它次要解决的是什么问题?举荐在哪些场景用? ElementUIElementUI是怎么做表单验证的?在循环里对每个input验证怎么做呢?你有二次封装过ElementUI组件吗?ElementUI怎么批改组件的默认款式?ElementUI的穿梭组件如果数据量大会变卡怎么解决不卡的问题呢?ElementUI表格组件如何实现动静表头?ElementUI应用表格组件时有遇到过问题吗?有浏览过ElementUI的源码吗?我的项目中有应用过ElementUI吗?有遇到过哪些问题?它的应用场景次要是哪些?有用过哪些vue的ui?说说它们的优缺点? mint-uimint-ui应用过程中有没有遇到什么坑?怎么解决的?说出几个mint-ui罕用的组件mint-ui是什么?你有应用过吗?

October 12, 2021 · 1 min · jiezi

关于vue.js:vue面试

1 Vue.js 双向绑定的原理Vue.js 2.0 采纳数据劫持(Proxy 模式)联合发布者-订阅者模式(PubSub 模式)的形式,通过 Object.defineProperty()来劫持各个属性的 setter,getter,在数据变动时公布音讯给订阅者,触发相应的监听回调。 每个组件实例都有相应的watcher程序实例,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的setter被调用时,会告诉watcher从新计算,从而以致它关联的组件得以更新。 Vue.js 3.0, 放弃了Object.defineProperty ,应用更快的ES6原生 Proxy (拜访对象拦截器, 也称代理器) 步骤: 须要observe的数据对象进行递归遍历,包含子属性对象的属性,都加上setter和getter这样的话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据变动 compile解析模板指令,将模板中的变量替换成数据,而后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,增加监听数据的订阅者,一旦数据有变动,收到告诉,更新视图 Watcher订阅者是Observer和Compile之间通信的桥梁,次要做的事件是: ①在本身实例化时往属性订阅器(dep)外面增加本人 ②本身必须有一个update()办法 ③待属性变动dep.notice()告诉时,能调用本身的update()办法,并触发Compile中绑定的回调,则功成身退。 MVVM作为数据绑定的入口,整合Observer、Compile和Watcher三者,通过Observer来监听本人的model数据变动,通过Compile来解析编译模板指令,最终利用Watcher搭起Observer和Compile之间的通信桥梁,达到数据变动 -> 视图更新;视图交互变动(input) -> 数据model变更的双向绑定成果。 2. Vue.js 3.0 放弃defineProperty, 应用Proxy的起因Object.defineProperty缺点监控到数组下标的变动时,开销很大。所以Vue.js放弃了下标变动的检测;Object.defineProperty只能劫持对象的属性,而Proxy是间接代理对象。Object.defineProperty须要遍历对象的每个属性,如果属性值也是对象,则须要深度遍历。而 Proxy 间接代理对象,不须要遍历操作。Object.defineProperty对新增属性须要手动进行Observe。vue2时须要应用 vm.$set 能力保障新增的属性也是响应式Proxy反对13种拦挡操作,这是defineProperty所不具备的Proxy 作为新规范,久远来看,JS引擎会持续优化 Proxy,但 getter 和 setter 根本不会再有针对性优化 3. Vue 2 中给 data 中的对象属性增加一个新的属性时会产生什么?如何解决?视图并未刷新。这是因为在Vue实例创立时,新属性并未申明,因而就没有被Vue转换为响应式的属性,天然就不会触发视图的更新,这时就须要应用Vue的全局 api $set():this.$set(this.obj, 'new_property', 'new_value') 4. Computed和Watch的区别computed 计算属性 : 依赖其它属性值,并且 computed 的值有缓存,只有它依赖的 属性值产生扭转,下一次获取 computed 的值时才会从新计算 computed 的值。watch 侦听器 : 更多的是察看的作用,无缓存性,相似于某些数据的监听回调,每 当监听的数据变动时都会执行回调进行后续操作。 ...

October 12, 2021 · 1 min · jiezi

关于vue.js:vue的input绑定vmodel

<input type="text" v-model.trim='msg'/><!--去掉前后空格--><input v-model.number='num' type="number"/><!--只能输出数据-->

October 12, 2021 · 1 min · jiezi

关于vue.js:Vue简单起步及解决方案

运行后两个提醒 第一提醒:你得下载他的开发者工具第二提醒:你得太大了,正告太多。你公布最好别用 解决:(1)下载谷歌的拓展,你必定进不去!我下载了, 获取:2tdh (2)Vue的API中有阐明:console.log( Vue.config ) 你会看到 productionTip此时咱们只须要启动时把嘴闭上 Vue.config.productionTip = false就行了 这里是所有的Vue2的API链接

October 11, 2021 · 1 min · jiezi

关于vue.js:react相关整理

pureComponent是 ReactComponent.prototype = isPureComponent = true为了在前面渲染的时候 checkShouldUpdate的时候 如果是isPureComponent 会进行shallowequall对oldProps,newProps 以及 newState oldState 两个都进行比拟,如果不平等从新更新,进行的是前浅比拟(object的话会判断keys 的length 以及keys) hooks 要确保每一次渲染都中都依照同样的程序被调用,不要再循环、嵌套以及条件中调用hooks useState初始化的时候回让memorizedState 等于 initialStateuseState返回的是[memorizedState,dispatch] useState 是依照执行程序执行的,其外部是以单向链表的模式Hook { memorizedState: any, //指向以后渲染节点的fiber,上一次残缺更新之后的最终状态值baseState: any, // 初始化的initialState,以及每次dispatch之后的newStatebaseUpdate, // 以后须要更新的update,每一更新完会赋值上一个updatequeue: updateQueue | null // 缓存更新队列,存储屡次更新昕蔚next: HOOk || null 指向下一个须要执行的hook,通过next串联每一个hook}对于首次加载还是更新useState = 以后fiber是否为空 , ReactCurrentDispatcher.current.useState 将要赋值成HooksDispatcherOnMount.useState,否则就是HooksDispatcherOnUpdate.useState.useState = ReactCurrentDispatcher.current.useState = HooksDispatcherOnMount.useState = mountState;更新时 useState = ReactCurrentDispatcher.current.useState = HooksDispatcherOnUpdate.useState = updateState。基于上从而初始化的时候调用的是mountState, 此时会创立一个新的hook,并返回以后的workInProgressHook, 初始化赋值memorizedState = baseState = initialState创立dispatch绑定子以后fiber和队列。 useEffectmountEffect hook.memorizedState = pushEffect(hookEffectTag, create(useEffect穿进去的函数), undefined,deps(触发依赖的数组)) => return mountEffectImpl(hooksEff)updateEffect 类同mountEffect,只是第三项会存在一个destroy,并且会areHookInputsEqual(nextDeps,prevDeps) 是否响应执行,如果是的则pushEffect(NoHookEffect,create,destroy,nextDeps)pushEffect针对mountEffect和updateEffect都执行了pushEffect做了条件判断,这外面是一个循环链表,这外面判断componentUpdateQueue是否为空,空从而是执行的mountEffect,此时责创立一个componentUpdateQueue,外面是{lastEffect: null};并且lastEffect指向effect.next,就是下一个effect ...

October 11, 2021 · 1 min · jiezi

关于vue.js:vue虚拟DOM与Diff算法

虚构DOM与Diff算法虚构DOMsnabbdomVue中的Diff算法1 虚构DOM概述VNode1.1 概述原生DOM为咱们提供了一些获取DOM元素以及操作DOM元素的API,能够对DOM元素进行增删改查。简单的页面状态保护须要提前写好大量的DOM操作,会造成状态很难保护,代码的逻辑也很凌乱。所以咱们会应用数据驱动的形式进行视图更新 - 数据与视图的绑定,更新数据时进行视图更新。 渲染咱们通常以状态作为输出,并生成DOM输入到页面上显示 - 渲染 问题当状态发生变化时,须要从新渲染,也就是从新输出与输入,那么应该如何确认状态产生了什么变动,又该如何更新DOM?显然把DOM全副删除再从新生成是不可取的。 解决方案Angular采纳脏查看的形式:设置一些触发条件,执行一个检测来遍历所有的数据,比照更改的地位执行更新的操作,性能低React与Vue采纳虚构DOM:依据状态生成一个虚构节点树,应用虚构节点树进行渲染。数据变动时,创立一个新的虚构节点树,对两棵树进行比照只渲染不同的局部。 Vue虚构节点树是由组件树建设起来的整个虚构节点(Virtual Node - vnode) 树React与Vue比照首先两者的虚构DOM是统一的,diff算法只有轻微区别,然而更新策略大不相同React:函数式组件思维 当状态变动会遍历diff以后组件所有子节点组件,react 16引入fiber,能够应用API进行中断,防止不必要的子组件从新渲染Vue:组件响应式思维 代理模式将data中的值用setter/getter绑定起来,并设置响应式watcher,当状态变动时会告诉到组件,在组件中diff Vue中的虚构DOM应用模板形容状态与DOM之间的映射关系。通过编译将模板转换成渲染函数,渲染函数会返回一个虚构节点树,而后patch到视图在patch的过程中会对新旧vnode进行比照,依据比照后果进行DOM操作来更新视图 1.2 VNodeVNode类能够实例化出不同类型的vnode实例,代表不同类型的DOM元素 1.2.1 VNode类 var VNode = function VNode ( tag, data, children, text, elm, context, componentOptions, asyncFactory ) { this.tag = tag; this.data = data; this.children = children; this.text = text; this.elm = elm; this.ns = undefined; this.context = context; this.fnContext = undefined; this.fnOptions = undefined; this.fnScopeId = undefined; this.key = data && data.key; this.componentOptions = componentOptions; this.componentInstance = undefined; this.parent = undefined; this.raw = false; this.isStatic = false; this.isRootInsert = true; this.isComment = false; this.isCloned = false; this.isOnce = false; this.asyncFactory = asyncFactory; this.asyncMeta = undefined; this.isAsyncPlaceholder = false; };实例化后产生的vnode能够了解为节点形容对象,它形容了应该如何创立实在DOM节点。通过vnode创立DOM,再插入到视图中这是渲染视图的根本过程。 ...

October 11, 2021 · 4 min · jiezi

关于vue.js:eltable-合并单元格展示合计行并自定义单元格内容

啰嗦两句怎么用了这么一个题目呢,是因为我的业务需要就是这样,迫于文笔垃圾且词穷,需要当题目。 业务需要 && 设计原型业务需要应该不须要说,看设计图,大家应该都很明确啦。那我来简略说一下(唉,皮一下很开心)。表格数据中: 第一列合并雷同名称的行,雷同名称数据项数量不固定。增加共计行,共计行名称占据两列单元格,合并居中共计行最初一个单元格,展现自定义内容,本需要中是进度条设计图如下,我把需要对应标上了实现先回顾element的合并行或列很分明了,绑定一个办法,办法中实现咱们的合并行,而咱们需要中要合并的行的数量并不固定,所以不能间接复制官网的例子。 computed: { groupNum() { // 获取需合并的数据名称 return new Set(this.data.map((o) => o.name)); } }, methods: { nameGroup(name) { // 获取雷同名称的长度 return this.getData.filter((o) => o.name == name).length; }, nameLen(name) { const tmp = Array.from(this.groupNum); let index = tmp.indexOf(name); let len = 0; for (let i = 0; i < index; i++) { len += this.nameGroup(tmp[i]); } return len; }, // 合并列 objectSpanMethod(data) { const { row, column, rowIndex, columnIndex } = data; if (columnIndex === 0) { // 依据重名的数据长度,计算合并的单元格长度 const len = this.nameGroup(row.name); let lenName = this.nameLen(row.name); if (rowIndex === lenName) { return { rowspan: len, // 依据理论反复的名称合并,而不是像官网例子中写死合并2行 colspan: 1, }; } else { return { rowspan: 0, colspan: 0, }; } } } }到这里,就实现咱们的需要第一项了。上面就是共计行。常规,温习下element的共计行绑定一个getSummaries办法,用于自定义共计行的数据展现。需要2:“共计”占据两列,合并并居中,这边参考网上实现,从款式上进行解决。暗藏第二列,让第一列colspan为2并居中。需要3:最初一个单元格中搁置进度条。这边我的思考是从理论渲染构造中增加元素。思考到表格存在翻页状况,进度条的值存在变动,所以这块解决放在监听watch中。 ...

October 9, 2021 · 2 min · jiezi

关于vue.js:封装Vue浮动弹出的图片查看器组件

前言早年在开发外部技术论坛时,为了实现一种流程的图片浏览体验,基于 Vue 开发了一个图片查看器组件,简略梳理了实现思路,心愿能给大家提供一下帮忙。 先来看看效果图: 从交互上来说内容很简略,点击页面上的图片,从图片以后的地位弹出图片浮动层,以便达到图片浏览的目标。 原理剖析依据点击事件,获得点击的图片元素使以后图片元素不可见(通过 visibility 或者 opacity)创立遮照层在图片元素以后地位创立等同大小的图片元素创立动画将图片放大至适合的尺寸(更新地位、比例)思路清晰了,实现起来也就不难了。 实现计划因为最终目标就是在 Vue 我的项目中应用,所以以下计划就间接封装成 Vue 组件了。 图片查看器根本构造图片查看器组件的视图构造很简略: <template> <transition> <div v-if="visible" class="image-viewer"> <img class="image" :src="src" /></div></transition></template> <script> export default { data() { return { el: null, // 鼠标点中的图片元素 visible: false, // 图片查看器是否可见 };},computed: { src() { return this.el?.src; },},methods: { show(el) { el.style.opacity = 0; // 暗藏源图片 this.el = el; this.visible = true; },},};</script> 复制代码简略解析一下: transition:外层嵌套 transition 组件,能够十分不便咱们后续做图片位移、缩放的动画成果.image-viewer:根元素用于搁置图片元素,还充当了遮照层的作用.image:点击图片后展现的浮动图片就是这个元素,之后操作都在这个图片上show(el):点击图片后会调用这个办法,将图片元素传入到该组件中,并将图片查看器显示进去款式也相当简略,绘制一个半透明的遮照很简略的动画: <style lang="less" scoped> .image-viewer { position: fixed;z-index: 99;top: 0;left: 0;height: 100%;width: 100%;background: rgba(0, 0, 0, 0.6);cursor: move;transition: background 0.3s;/* 渐入渐出的动画成果 */&.v-enter,&.v-leave-to { background: rgba(0, 0, 0, 0);}.image { position: absolute; user-select: none; transform-origin: center; will-change: transform, top, left;}}</style>复制代码从原处弹出图片并放大咱们的图片查看器曾经能把图片展现进去了,接下来使如何使查看器中的指标图片元素(.image)从源图片元素(el)中弹进去。 ...

October 9, 2021 · 3 min · jiezi

关于vue.js:vuex中mapState思想应用

背景:在需要开发过程中,有的接口返回的后果中有很多字段须要展现到页面上。通常能够将这些字段在.vue文件中封装为计算属性,或者从新将对应字段赋值到 data 中的字段来达到便于应用的目标。如下: computed(){ count1(){ return this.targetObj.count1 }, count2(){ return this.targetObj.count2 }, // ... // 设想一下。你要写 5 遍 或者 10 遍相似的代码}然而不论哪种办法,都会带来大量的代码冗余,极为好受。为解决这种景象,本文借用了应用了vuex 中 map 办法的思维,极大的缩减了冗余代码,并且可能对数据获取做对立的容错解决。 map办法:vuex 中根本的 state 提取应用办法,可通过 以下形式: computed(){ count(){ return this.$store.count }}同时 vuex 也同样留神到了问题,当 store 中要获取的数据很多时,这种形式将会产生极大的代码冗余,反复代码遍地走。你将会看到大量的计算属性的定义,以及长链路的对象属性提取。因而vuex 定义了一种 map 办法,用来批量的获取 store 中的指定数据。这种 map 办法实际上就是一种 工厂函数(高阶函数),用来生产特定模式的函数。以下是源码,能够看到,mapState 其实最终会返回一个对象 res, res中的每个属性都是一个办法,而这个办法返回 state 中的值。 var mapState = normalizeNamespace(function (namespace, states) { // 定义一个对象 用于存储 获取指定属性的办法 var res = {}; normalizeMap(states).forEach(function (ref) { var key = ref.key; var val = ref.val; // 定义 获取指定对象中指定属性的办法 res[key] = function mappedState () { var state = this.$store.state; var getters = this.$store.getters; // 依据 namespace 查找指定的 store 模块对象 if (namespace) { var module = getModuleByNamespace(this.$store, 'mapState', namespace); if (!module) { return } state = module.context.state; getters = module.context.getters; } // 获取通过指定 namespace 失去的 store module 中的属性 return typeof val === 'function' ? val.call(this, state, getters) : state[val] }; }); // 返回 函数对象 return res });利用:仿照这种思维,能够对某个简单对象中的字段的获取形式进行优化。定义的工厂函数如下所示 ...

October 9, 2021 · 2 min · jiezi

关于vue.js:8个Date命令使用示例

date命令用于显示和设置Linux零碎上的日期和工夫设置。本教程简要介绍了如何应用date命令在Linux零碎上显示和设置日期。不带选项的Date命令date命令不加任何命令选项,它显示以后日期和工夫,包含星期几,月份,年份,hs格局的工夫以及时区,如下所示。 [root@server1 ~]# dateMon May 24 14:50:31 CST 20218个Date命令应用示例8个Date命令应用示例 以世界规范工夫显示要以UTC(世界规范工夫)显示工夫,须要加-u选项。 [root@server1 ~]# date -uMon May 24 06:51:21 UTC 20218个Date命令应用示例8个Date命令应用示例 以字符串格局显示特定日期能够应用--date选项以字符串格局显示特定日期,这不会影响零碎的日期和工夫,只是将日期格局转换为字符串: [root@server1 ~]# date --date="5/20/2021 13:14"Thu May 20 13:14:00 CST 20218个Date命令应用示例8个Date命令应用示例 应用date命令查看过来的日期date命令还能够打印绝对于以后日期的过来日期和工夫。例如查看9天前的日期是多少,请运行命令: [root@server1 ~]# date --date="9 days ago"Sat May 15 14:56:47 CST 20218个Date命令应用示例8个Date命令应用示例查看三个月前的日期是多少: [root@server1 ~]# date --date="3 months ago"Wed Feb 24 14:57:29 CST 20218个Date命令应用示例8个Date命令应用示例查看两年前的明天日期是多少: [root@server1 ~]# date --date="2 years ago"Fri May 24 15:02:40 CST 20198个Date命令应用示例8个Date命令应用示例 应用date命令查看将来的日期date命令也能够显示未来的日期,例如查看今天的日期是多少: [root@server1 ~]# date --date="tomorrow"Tue May 25 14:58:49 CST 20218个Date命令应用示例8个Date命令应用示例要查看从现在起一周后的确切日期,请运行: ...

October 9, 2021 · 2 min · jiezi

关于vue.js:Vue分别运用class绑定和style绑定通过点击实现样式的切换

放一下Vue官网文档 https://cn.vuejs.org/v2/guide... <div v-bind:class="[activeClass, errorClass]"></div>能够简写成<div :class="[activeClass, errorClass]"></div> class绑定 <!-- * @Author: [you name] * @Date: 2021-10-08 15:15:52 * @LastEditors: [you name] * @LastEditTime: 2021-10-08 22:46:18 * @Description: --><!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.13/vue.js"></script> <style> /* 点击前的款式 */ .class1 { background-color: #fff; color: #333; } /* 点击之后的款式 */ .class2 { background-color: #f52819; color: #fff; } /* 给按钮设置款式 */ button { width: 80px; height: 40px; border-radius: 5px; border: 2px solid rgb(179, 167, 167); background-color: #fff; } </style></head><body> <div id="app"> <!-- 别离给按钮设置点击事件 --> <button @click='handler1' :class="[isYes1? 'class1' : 'class2']">按钮1</button> <button @click='handler2' :class="[isYes2? 'class1' : 'class2']">按钮2</button> <button @click='handler3' :class="[isYes3? 'class1' : 'class2']">按钮3</button> </div> <script> // 第二种办法 let vm = new Vue({ el:'#app', data:{ isYes1:true, isYes2:true, isYes3:true, }, methods:{ handler1(){ this.isYes1 = false, this.isYes2 = true, this.isYes3 = true, console.log('第一个点击事件'); }, handler2(){ this.isYes2 = false, this.isYes1 = true, this.isYes3 = true, console.log('第二个点击事件'); }, handler3(){ this.isYes3 = false, this.isYes2 = true, this.isYes1 = true, console.log('第三个点击事件'); }, } }) </script></body></html> style绑定 ...

October 8, 2021 · 2 min · jiezi

关于vue.js:eltree懒加载中使用递归更改树节点状态值

问题形容我的项目中应用树结构,次要信息个别在树的叶子节点上记录。然而有些状况下,后端是不把一些树叶子节点的状态信息做记录的,比方树叶子节点的状态(是否增加、是否珍藏什么的),后端只是把树结构所须要的数据返回给前端,至于状态什么的,前端须要去记录,而且状态的更改,也是须要前端去记录更改的咱们先看一下我的项目的效果图: 效果图 功能分析当咱们点击左侧的叶子节点的时候,更改叶子节点成已增加的状态,同时将左侧的数据追加到右侧的表格中去:即:(点击叶子节点,更改叶子节点状态)当咱们再次点击叶子节点的时候,将叶子节点已增加的状态,批改成未增加的状态,同时删除右侧表格中的对应项:即:(点击叶子节点,更改叶子节点状态)当咱们删除右侧表格中的某一项时候,同时更改左侧的叶子节点的状态:即:(递归更改左侧树结构对应节点的状态)本例是树组件懒加载的写法,对于树组件懒加载的写法,也能够参考我之前的一篇文章,传送门:https://segmentfault.com/a/11...点击叶子节点,更改叶子节点状态// 点击树组件节点上的增加或未增加按钮,更改树的增加未增加的状态,同时追加或删除右侧表格中对应的行的数据 changeStatus(node, data) { // console.log("data是点击的这个树节点所绑定的数据", data); if (data.status == "0") { data.status = "1"; // 这里咱们能够间接更改树节点上的对应数据,便会失效,未增加变成已增加 this.tableData.push(data); // 追加进右侧表格 } else if (data.status == "1") { data.status = "0"; // 已增加变成未增加 this.tableData.forEach((item, index) => { // 同时,依据id去删除掉右侧的数据 if (item.id == data.id) { this.tableData.splice(index, 1); } }); } }留神html中的这个changeStatus办法是点击按钮的高阶函数的写法,这样:@click="() => changeStatus(node, data)"递归更改左侧树结构对应节点的状态// 第一步:依据删除或者id,而后依据id递归更改树节点状态字段// 第二步:把表格中的数据删除即可removeRow(row) { // console.log("行数据", row.id); // 获取tree的所有的node节点数组(DOM节点),这里是两个数组,对应的就是西游记和三国演义的最外层的数组() let allNodesDom = this.$refs.myTree.root.childNodes; console.log("node节点树结构", allNodesDom); function bianli(checkedData) { for (const i in checkedData) { // 阐明到最内层了 if (checkedData[i].childNodes.length == 0) { // 到最内层当前,就看看对应的id,是否与移除行的id统一 if (checkedData[i].data.id == row.id) { // 若id统一,就更改树组件的最内层节点的数据即可 checkedData[i].data.status = "0"; break; } } else if (checkedData[i].childNodes.length > 0) { // 阐明没到最内层,那就持续递归调用本人,持续找 bianli(checkedData[i].childNodes); } } return; } bianli(allNodesDom); // 递归调用,更改数据 // 同时依据id删除右侧的表格对应的行 this.tableData.forEach((item, index) => { if (item.id == row.id) { this.tableData.splice(index, 1); } })}代码附上<template> <div class="box"> <!-- 左侧树局部 --> <div class="leftBox"> <el-tree ref="myTree" :props="props" :load="loadNode" lazy node-key="id"> <span slot-scope="{ node, data }"> <i class="el-icon-folder-opened" style="color: #448ff7" v-show="node.isLeaf !== true" ></i> <!-- <span style="padding-left: 8px">{{ node.label }}</span> --> <span style="padding-left: 8px">{{ data.name }}</span> <el-button style="margin-left: 12px" size="small" type="text" v-show="node.isLeaf === true" @click="() => changeStatus(node, data)" > <span :class="{ highLightTree: data.status == '0' }">{{ data.status == "0" ? "未增加" : "已增加" }}</span> </el-button> </span> </el-tree> </div> <!-- 右侧表格局部 --> <div class="rightBox"> <el-table :data="tableData" border style="width: 100%" :header-cell-style="{ height: '48px', background: '#FAFAFA', color: '#333333', fontWeight: 'bold', }" > <el-table-column prop="id" label="id编号"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="home" label="地址"></el-table-column> <el-table-column label="操作"> <template slot-scope="scope"> <el-button @click="removeRow(scope.row)" type="danger" plain size="small" >移除</el-button > </template> </el-table-column> </el-table> </div> </div></template><script>export default { data() { return { props: { label: "name", isLeaf: "isLeaf", }, tableData: [], }; }, methods: { //初始加载最外层节点 loadNode(node, resolve) { // 点击节点加载相应节点的数据 if (node.level == 0) { this.loadfirstnode(resolve); } //如果开展其余级节点,动静从后盾加载下一级节点列表 if (node.level >= 1) { this.loadchildnode(node, resolve); } }, //加载第一级节点 async loadfirstnode(resolve) { let params = { level: 0, }; const res = await this.$api.getTreeData(params); return resolve(res.data); }, //加载节点的子节点汇合 async loadchildnode(node, resolve) { // console.log("超过二级的", node, node.level); let params = { id: node.key, }; const res = await this.$api.getTreeChildData(params); return resolve(res.data); }, // 点击树组件节点上的增加或未增加按钮,更改树的增加未增加的状态,同时追加或删除右侧表格中对应的行的数据 changeStatus(node, data) { // console.log("data是点击的这个树节点所绑定的数据", data); if (data.status == "0") { data.status = "1"; // 这里咱们能够间接更改树节点上的对应数据,便会失效,未增加变成已增加 this.tableData.push(data); // 追加进右侧表格 } else if (data.status == "1") { data.status = "0"; // 已增加变成未增加 this.tableData.forEach((item, index) => { // 同时,依据id去删除掉右侧的数据 if (item.id == data.id) { this.tableData.splice(index, 1); } }); } }, // 第一步:依据删除或者id,而后依据id递归更改树节点状态字段 // 第二步:把表格中的数据删除即可 removeRow(row) { // console.log("行数据", row.id); // 获取tree的所有的node节点数组(DOM节点),这里是两个数组,对应的就是西游记和三国演义的最外层的数组() let allNodesDom = this.$refs.myTree.root.childNodes; console.log("node节点树结构", allNodesDom); function bianli(checkedData) { for (const i in checkedData) { // 阐明到最内层了 if (checkedData[i].childNodes.length == 0) { // 到最内层当前,就看看对应的id,是否与移除行的id统一 if (checkedData[i].data.id == row.id) { // 若id统一,就更改树组件的最内层节点的数据即可 checkedData[i].data.status = "0"; break; } } else if (checkedData[i].childNodes.length > 0) { // 阐明没到最内层,那就持续递归调用本人,持续找 bianli(checkedData[i].childNodes); } } return; } bianli(allNodesDom); // 递归调用,更改数据 // 同时依据id删除右侧的表格对应的行 this.tableData.forEach((item, index) => { if (item.id == row.id) { this.tableData.splice(index, 1); } }) } },};</script>对于本篇文章的前后端的残缺代码,欢送到我的Gitee上下载哈,后端用express模仿数据接口返回前端,传送门如下 https://gitee.com/ah-shuai/de...

October 8, 2021 · 3 min · jiezi

关于vue.js:工作笔记20210615至今

Echarts篇根底所有图都是一个dom,一个options的写法,次要的options的配置,太多了 html局部<div :id="config.id" style="width:100%;height: 100%"></div>js局部import echarts from 'echarts'import 'echarts-wordcloud' // 词云图,独自引入Vue.prototype.$echarts = echartsconst myChart = this.$echarts.init(document.getElementById(this.config.id))myChart.setOption(this.config.option)词云图词云图是要另外装置依赖的,echarts外面并没有蕴含这个性能 "dependencies": { "axios": "^0.21.1", "core-js": "^3.15.2", "echarts": "^4.9.0", //本地 "echarts-wordcloud": "^1.1.3",//就是这个 "element-ui": "^2.4.5", "html2canvas": "^1.0.0-rc.7", "vue": "^2.6.14", "vue-router": "^3.5.2", "vuex": "^3.6.2", "xlsx": "^0.16.5" },配置// 声量情感散布-提及内容词云 wordOption: { id: 'wordOption', option: { series: [ { // 词的类型 type: 'wordCloud', // 设置字符大小范畴,那种字太多的有可能因为最小值太小不显示,能够设大一点 sizeRange: [16, 58], // 每个字的歪斜角度 rotationRange: [-45, 90], textStyle: { normal: { // 生成随机的字体色彩 color: function () { return 'rgb(' + [ Math.round(Math.random() * 160), Math.round(Math.random() * 160), Math.round(Math.random() * 160) ].join(',') + ')' } } }, // 不要遗记调用数据 data: [ { 'name': '花鸟市场', 'value': 1446 }, { 'name': '汽车', 'value': 928 }, { 'name': '视频', 'value': 906 }, { 'name': '电视', 'value': 825 }, { 'name': '动漫', 'value': 486 } ] } ] } },柱状图配置// 声量情感散布 volEmotionOption: { id: 'volEmotionOption', option: { color: ['#32B0F2', '#006699', '#4cabce'], // 这个是色彩 xAxis: { type: 'category', data: [] }, yAxis: [ { name: '声量', type: 'value' }, { name: '占比', type: 'value', min: 0, max: 100, axisLabel: { formatter: '{value} %' } } ], legend: { bottom: '5%', data: ['总体', '侧面', '负面'] }, series: [ { name: '总体', type: 'bar', data: [100] }, { name: '侧面', type: 'bar', data: [200] }, { name: '负面', type: 'bar', data: [300] } ] } },柱状图的xAxis和series,legend的关系有点奇怪,emmm,我笔记懒的具体些了,我就大略说一下xAxis.data,比方有3个,[1,2,3];series的每一项的data也必须有3值,对应每个柱子的内容,留神不是series的个数,是series每一项的data这个个数; ...

October 8, 2021 · 7 min · jiezi

关于vue.js:智汀家庭云开发指南Web项目架构

这里次要讲下我的项目的构造和技术架构,不便咱们疾速开始开发 1.我的项目架构 【1】我的项目技术架构本我的项目次要采纳vue + webpack + vant我的项目次要用vue-cli3脚手架进行初始化,而后依据我的项目需要进行构造上的调整vuejs个性 vuejs体积小学习成本低能疾速提交开发效率vuejs的生态欠缺webpack个性 模块化按需加载丰盛的插件丰盛的配置vant个性 提供 60 多个高质量组件,笼罩挪动端各类场景性能极佳,组件均匀体积不到 1kb(min+gzip)单元测试覆盖率 90%+,提供稳定性保障欠缺的中英文文档和示例反对 Vue 2 & Vue 3反对按需引入反对主题定制反对国际化反对 TypeScript反对 SSR【2】我的项目构造│ .browserslistrc │ .editorconfig│ .eslintrc.js // eslint配置文件│ .gitignore // git提交疏忽配置│ babel.config.js // babel配置文件│ package-lock.json // 依赖缓存文件│ package.json // package配置文件│ postcss.config.js // postcss独立配置文件│ README.md // 阐明文件│ vue.config.js // webpack相干配置文件├──public // 动态资源文件├──plugins // 插件汇合└─src├─api│ ├──http.js // api申请文件,每个api申请都在这里│ ├──instance.js // api申请总入口,在这里能够做申请的对立解决├─assets // 资源文件夹│├─lang // 多语言文件夹│├─bus // 全局vue bus│├─components // 通用组件库│├─router.js // 路由文件│├─store.js // store相干│├─App.vue // 程序入口vue文件│├─main.js // 程序入口文件│├─utils // 相干工具的办法汇合│└─views // 页面文件【3】示例:hello word怎么增加一个hello word的页面? ...

October 8, 2021 · 1 min · jiezi

关于vue.js:智汀家庭云Web端快速开始

1.开发工具本我的项目次要采纳vue + webpack + vant 2.源码地址 3.构建版本首先咱们通过git近程拉取我的项目 我的项目拉取胜利后,进入到我的项目的根目录,装置我的项目依赖 装置好了依赖,咱们就能够启动我的项目了 当初我的项目曾经能够跑起来,并且能够在浏览器上看到咱们的我的项目,但还只是停留在登录页面 那当初怎么让咱们的我的项目整个流程走通,咱们须要启动咱们的后端我的项目 依赖后端Golang我的项目 应用 Docker 运行智汀家庭云 Golang开发环境搭建 有了后端接口,咱们如何能让咱们的我的项目调用到咱们本人的接口? 批改咱们接口的申请地址 在咱们我的项目的根目录下找到vue.config.js这个配置文件,关上咱们的vue.config.js 咱们只须要把tartget改成接口的地址,咱们就能够调用接口的数据了 更多配置请查看传送门新增账号为了使咱们更晦涩的体验我的项目,咱们须要一个测试账号 个别在本地新增账号有两种形式: 手动往数据库里增加一个下载智汀app,连贯sa后设置一个账号密码 体验专业版账号登录胜利后,进入智慧家庭云,体验Web端专业版

October 8, 2021 · 1 min · jiezi

关于vue.js:智汀家庭云Web端开发前准备

智汀家庭云Web版 是一款联合智慧核心(SA)的Web客户端,反对用户在SA所在局域网环境下实现智能家居的设施管制等性能。 1.开发前筹备我的项目运行环境要运行智汀家庭云,你必须要在本地搭建好以下环境 装置nodejs的开发环境(node装置参考教程)下载一个集成开发工具,个别这里举荐vscode,间接去官网下载安装即可 技能筹备以下是次要波及的技术,为了你能顺利的进行开发,你必须先相熟他们 javascripthtmlcssvuejswebpackvant组件库 我的项目获取当你的环境装置好了,还有所需的技能曾经把握,那么当初你能够从源码开源网站获取咱们的我的项目。 装置依赖我的项目获取胜利后,间接用vscode关上我的项目 如图: 而后用快捷键 “ctrl + ~” 关上命令窗口 而后咱们能够在窗口输出以下命令装置我的项目所需的依赖 npm install 或 yarn install如图: 如果你不是用vscode关上 那么你能够用你操作系统的命令窗口进入到该我的项目根目录 执行下面命令一样能够装置我的项目依赖 如图: 启动我的项目等你我的项目依赖装置完后,你能够执行以下命令启动我的项目 npm run serve如图:

October 8, 2021 · 1 min · jiezi

关于vue.js:vueVueRouter路由管理

Vue-Router路由治理根底应用进阶1 根底装置与根本应用动静路由嵌套路由编程式导航命名路由命名视图重定向和别名路由组件传参History模式Modules1.1 装置与根本应用//装置npm install vue-router --save//main.js内引入import VueRouter from 'vue-router'Vue.use(VueRouter)//此时在vue实例上会多出`$route`和`$router`两个属性创立两个页面 //About.vue<template> <div>对于页面</div></template>//Detail.vue<template> <div>对于页面</div></template>配置路由 //router.js文件import VueRouter from "vue-router";import About from './pages/About'import Detail from './pages/Detail'export const router = new VueRouter({ routes: [ { path: '/about', component: About, }, { path: '/detail', component: Detail } ]})引入VueRouter并实例化,引入组件配置对象的routes选项,以数组-对象模式注册路由,包含门路与组件在mian.js中引入router实例并注册 //mian.jsimport { router } from './router'new Vue({ router, render: h => h(App),}).$mount('#app')//此时能够察看到$router与$route的相干配置在App.vue中应用路由 <template> <div id="app"> <router-link to="/about">跳转about</router-link><br /> <router-link to="/detail">跳转detail</router-link> <router-view></router-view> </div></template><script>export default { name: "App",};</script>router-link为路由入口,在to中配置门路router-view为路由进口,跳转的页面在此处显示相似于动静组件,实现了根本的跳转性能,路由的性能更加弱小$router相似于$store,在根实例注册后,子组件都能够拜访到原路由实例,不须要频繁的在子组件中引入。$route是以后路由1.2 动静路由依据不同的门路参数跳转至同一组件,显示不同的数据 //router.js{ path: '/about:id', component: About,},//App.vue<template> <div id="app"> <router-link to="/about/:'1'">用户1</router-link><br /> <button @click="to">用户2</button> <router-view></router-view> </div></template><script>export default { name: "App", methods: { to() { this.$router.push('/about/:"2"'); }, },};</script>//About.vue<template> <div>对于页面{{ userId }}</div></template><script>export default { computed: { userId() { return this.$route.params.id; }, },};</script>在router中注册的门路增加:param跳转时能够应用router-link或者应用$router.push,门路中携带参数在跳转至的路由能够通过$route.params拜访动静门路的参数 ...

October 6, 2021 · 3 min · jiezi

关于vue.js:vue一些基础知识

一、vue2.0/3.0 双向数据绑定的实现原理vue2.0ES5:Object.defineProperty <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title></head><body> 姓名: <span id='spanName'></span> <br/> <input type='text' id='inpName' /></body> <script> let obj = { name: '' } let newObj = JSON.parse(JSON.stringify(obj)) Object.defineProperty(obj, 'name', { get(){ return newObj.name }, set(val){ if(val === newObj.name) return newObj.name = val; observer(); }, }) function observer(){ spanName.innerHTML = obj.name; inpName.value = obj.name } setTimeout(() => { obj.name = '我是eternity'; }, 1000) // 以下相似于v-model inpName.oninput = function () { obj.name = this.value; } </script></html>存在的问题: 1、须要对原始数据克隆 2、须要别离给对象中每一个属性设置监听 3、对于对象和数组的监听不是很无效,可用$set,或者原生的办法; ...

October 5, 2021 · 2 min · jiezi

关于vue.js:vueVuex状态管理模式

Vuex状态管理模式多个组件依赖或批改同一个状态 - 共享应用Vue.observable能够实现一个轻量型的状态治理 根底Modules1 根底根本构造与应用StateMutationsActionsGttersmap1.1 根本构造与应用结构图 装置Vuex npm install vuex --savestore.js文件 import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)export const store = new Vuex.Store({ mutations: { increment() { this.state.count++ }, decrement() { this.state.count-- } }, state: { count: 0 }})组件一 <template> <div> <button @click="add">+</button> <span>{{ num }}</span> </div></template><script>import { store } from "../store";export default { store: store, computed: { num() { return store.state.count; }, }, methods: { add() { store.commit("increment"); }, },};</script><style></style>//main.jsimport { store } from './store'new Vue({ store, render: h => h(App),}).$mount('#app')//组件二dec() { this.$store.commit("decrement");},两个组件能够操作同一个值 ...

October 5, 2021 · 3 min · jiezi

关于vue.js:Vuejs-作者尤雨溪宣布Vite-官方中文文档正式迁移至-Gitee-Pages-部署

近日,Vue.js 作者尤雨溪 @尤小右 在其微博连发两条音讯,发表“ Vite 官网中文文档曾经正式迁徙到了 Gitee Pages 部署”。在对 Gitee 的反对表示感谢后,又补充道“后续 Vue 官网中文文档也将迁徙过来”。 Vite 官网中文文档地址:https://cn.vitejs.dev/ 上个月 22 日,尤雨溪就曾对国内用户在未经官网翻译团队认可的状况下擅自部署Vue中文文档的做法表白了“不满”,并点名了两个网站:vitejs.cn 和 vue3js.cn。 他示意,只管能够了解这是为了给国内开发者提供更快的访问速度,但也存在“1、非官方保护的文档不能保障内容同步,呈现内容滞后容易导致用户困惑;2、有些部署的还退出了给非官方的微信群导流”这两个问题。 他强调,尽管 Vue / Vite 的中文文档是 MIT 协定开源的,但文档自身具备版权,在没有官网翻译团队认可的状况下,擅自部署是十分不尊重翻译者劳动的行为,并呐喊部署了这些网站的用户们进行相似的行为。 Vue.js 是一个由 MIT (麻省理工学院)许可的开放源码我的项目,它的继续开发齐全是在一些令人敬畏的支持者的反对下实现的。如果你想退出他们,请思考:1。成为 Patreon 的支持者或赞助者。2.成为开放式个体的支持者或赞助者。3.通过贝宝或加密货币一次性捐献。 据悉,通过 Patreon 捐献的资金将间接用于反对 Evan You (尤雨溪)在Vue.js 上的全职工作。而通过 Open Collective 捐献的资金则以通明费用的模式进行治理,并将用于弥补外围团队成员的工作和费用或资助社区活动(捐赠者的姓名/徽标将通过在任一平台上捐献取得适当的认可和曝光)。 Vue 是一个用于构建用户界面的渐进式框架。它从一开始,就被设计为可增量采纳的,且可依据不同的用例在库和框架之间轻松扩大。它包含一个只关注视图层的可靠近的外围库,以及一个反对库的生态系统,可帮忙用户解决大型单页应用程序的简单问题。

October 4, 2021 · 1 min · jiezi

关于vue.js:vue内置的组件

内置的组件componenttransitiontransition-groupkeep-aliveslot1 componentprops:is、 inline-template能够依据数据动静渲染组件具体见上一章节的is属性 2 transition包裹一个元素或动静组件,实现过渡的成果一般元素示例 <template> <div id="app"> <button @click="show = !show">Toggle</button> <transition name="fade"> <p v-if="show">hello world</p> </transition> </div></template><script>export default { name: "App", data() { return { show: true, }; },};</script><style>.fade-enter-active,.fade-leave-active { transition: opacity 0.5s;}.fade-enter,.fade-leave-to { opacity: 0;}</style>在扭转v-if的值的时候并没有立刻删除元素,这是因为当插入或删除蕴含在transition组件中的元素,Vue将会做以下解决判断元素是否利用了CSS过渡或动画,在失当的机会增加/删除CSS类名如果过渡组件提供了钩子函数,这些钩子函数将在失当的机会被调用如果没有上述的两个条件,DOM操作在下一帧立刻执行2.1 transition的属性name:主动生成CSS过渡类名appear:是否在初始渲染时应用过渡css:是否应用css过渡类type:指定过渡事件的类型,侦听过渡何时完结,transition | animationmode:管制来到/进入过渡的工夫序列,out-in | in-outduration:指定过渡的持续时间,number|{enter:number,leave:number} 仅应用js过渡的元素增加v-bind:css="false",跳过CSS的检测,防止过渡过程中CSS的影响2.2 过渡的类名v取决于transition的name属性 v-enter:进入过渡的开始状态 在元素被插入之前失效,在元素被插入之后的下一帧移除v-enter-active:进入过渡失效时的状态 元素被插入之前失效,在过渡/动画实现之后移除。能够定义过渡的过程工夫,提早和曲线函数v-enter-to:进入过渡的完结状态 元素被插入之后下一帧失效(移除v-enter),在过渡/动画实现后移除v-leave:来到过渡的开始状态 来到过渡被触发时立即失效,下一帧移除v-leave-active:来到过渡的失效时的状态 来到过渡被触发时立即失效,在过渡/动画实现之后移除。能够定义来到过渡的过程工夫,提早和曲线函数v-leave-to:来到过渡的完结状态 来到过渡被触发之后下一帧失效(移除v-leave),在过渡/动画实现之后移除 2.3 钩子函数<transition v-on:before-enter="beforeEnter" v-on:enter="enter" v-on:after-enter="afterEnter" v-on:enter-cancelled="enterCancelled" v-on:before-leave="beforeLeave" v-on:leave="leave" v-on:after-leave="afterLeave" v-on:leave-cancelled="leaveCancelled"></transition>enter和leave中必须应用done进行回调其余无关Vue过渡的介绍见官网过渡&动画 3 transition-group多组件过渡属性: tag:指定标签,默认为spanmove-class:笼罩挪动过渡期间利用的CSS类除了mode,其余与transition雷同事件与transition雷同具体介绍见官网动画&过渡 4 keep-alive包裹动静组件,会缓存不流动的组件实例,不销毁属性 include:String|RegExp,缓存指定的组件exclude:String|RegExp,回绝缓存指定的组件max:number,最多能够缓存多少组件实例//子组件一<template> <div>One</div></template><script>export default { beforeDestroy() { console.log("销毁"); },};</script>//子组件二<template> <div>Two</div></template><script>export default { beforeDestroy() { console.log("销毁"); },};</script>//父组件<template> <div id="app"> <button :value="component" @click="component = 'One'">组件一</button> <button :value="component" @click="component = 'Two'">组件二</button> <component :is="component"></component> </div></template><script>export default { name: "App", components: { One: () => import("./components/One.vue"), Two: () => import("./components/Two.vue"), }, data() { return { component: "One", }; }, methods: {},};</script>在不增加keep-alive时,切换组件时会间接销毁转出的组件//父组件<keep-alive> <component :is="component"></component></keep-alive>//子组件一<template> <div>One</div></template><script>export default { beforeDestroy() { console.log("销毁"); }, activated() { console.log("进入One"); }, deactivated() { console.log("来到One"); },};</script>//子组件二同上应用keep-alive会多两个生命周期钩子activated:当切换回组件时调用deactivated:当切换出组件时调用5 slot作为组件模板之中的内容散发插槽属性 ...

October 3, 2021 · 1 min · jiezi

关于vue.js:工作问题总结二H5开发安卓返回键问题

1、路由跳转页面改写在组件中,有须要跳转页面,并且不让用户返回的状况,例如:领取、登录、登记等。请做一下批改: 1、this.$router.push()全副改写为this.$router.replace() 2、<router-link to="/">全副改写为<router-link to="/" replace> 因为:this.$router.push会在window.histroy中保留浏览器的历史记录。 这样返回键会返回上一个路由,而this.$router.replace不会在history中保留。 2、子页面返回改写以聊天界面为例: 1、音讯列表页面 每条音讯的点击事件应用this.$router.push(),点击进入详情页,这样保障histroy中记录着主页面的地址。 2、详情页面 左上角有个返回按钮,这个返回按钮的跳转事件千万不能用this.$router来跳转,否则会呈现返回错乱。 而是应用this.router.back()或者this.router.go(-1),这样既能胜利返回上一页,也会革除掉上一条history记录。 如果须要带状态或者参数返回上一页,我目前的办法是将子页面写成弹窗模式,悬浮在最顶层页面。 3. 通过获取页面属性判断回退解决单点登陆点击两次回退的问题 (window.location.href = url, 代码书写在单点登陆页面) window.performance.navigation.type蕴含三个值: 0 : TYPE_NAVIGATE (用户通过惯例导航形式拜访页面,比方点一个链接,或者个别的get形式) 1 : TYPE_RELOAD (用户通过刷新,包含JS调用刷新接口等形式拜访页面) 2 : TYPE_BACK_FORWARD (用户通过后退按钮拜访本页面) window.addEventListener('pageshow', function (event) { if(event.persisted || window.performance && window.performance.navigation.type == 2){ console.log('window.performance.navigation.type: '+ window.performance.navigation.type) }})4. 跳转外链window.location.href = url 跳转,回退会间接退出利用;应用利用api办法关上新的页面,才可回退到上一个页面 5. h5中ios手机后退页面显示空白,须要下拉才展现页面// cssoverflow-y: auto-webkit-overflow-scrolling: touchheight 100%// vueupdated() { document.scrollingElement.scrollTop = 0},6. H5嵌入原生利用的调试工具// https://github.com/Tencent/vConsole<script src="https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js"></script><script>var vConsole = new VConsole();</script>

October 3, 2021 · 1 min · jiezi

关于vue.js:vue特殊的attribute

非凡的attributekeyrefiskey预期:Number|Stirng|Boolean|Symbol次要用在Vue的虚构DOM的diff算法,比照新旧nodes来辨识Vnodes 不应用key时,Vue会应用一种最大限度缩小动静元素且尽可能的尝试就地修复/复用雷同类型元素的算法应用key时,会基于key的变动重新排列元素程序,并且会移除key不存在的元素 常见与v-for组合应用v-for独自应用时能够强制替换元素,变动的key值,虚构DOM的diff算法会优先比拟key,不存在则会整体替换,而不是局部的替换 <template> <div id="app"> <input type="text" v-model="msg" /> <div :key="msg">{{ msg }}</div> </div></template><script>export default { name: "App", data() { return { msg: "hello", }; },};</script>2 ref给元素或子组件注册援用信息。援用信息会注册在父组件的$refs对象上一般的DOM元素:该DOM元素子组件:组件实例$refs是非响应式的 <template> <div id="app"> <span ref="span">{{ msg }}</span> <Child ref="child" /> <button @click="showRefs()">获取refs</button> </div></template><script>import Child from "./components/Child.vue";export default { name: "App", data() { return { msg: "hello", }; }, components: { Child, }, methods: { showRefs() { console.log(this.$refs); }, },};</script>3 is预期:String|Object绑定须要渲染的动静组件例如在详情页中,不确定应用哪一类型的组件,能够依据数据来应用动静组件 数据文件 export default [ { id: 1, type: 'video' }, { id: 2, type: 'text' }, { id: 3, type: 'image' }, { id: 4, type: 'text' }]父组件 ...

October 3, 2021 · 1 min · jiezi

关于vue.js:vueVue中的指令

Vue中的指令v-textv-htmlv-showv-ifv-elsev-else-ifv-forv-onv-bindv-modelv-slotv-prev-cloakv-once1 v-text更新元素的textContent局部更新能够应用插值语法{{Mustache}} 2 v-hetml更新元素的innerHTML内容按一般HTML插入-不会作为Vue模板进行编译 在网站上动静渲染HTML很危险,容易导致XSS攻打3 v-show v-if v-else v-else-if条件渲染v-show 相当于扭转标签的displayv-if 是实在的条件渲染,值为falsy时会将元素从DOM构造中删除 v-else v-else-if 能够与v-if组成一个链式的条件渲染,与日常的if - else代码块有相似的逻辑 4 v-for列表渲染基于源数据屡次渲染元素或模块,alias in expressionv-for的默认行为会尝试原地批改元素而不是挪动它们。要强制从新排序元素,须要非凡的attribute key来提供一个排序的提醒expression:Array Object Number String Iterable //数组<template> <div id="app"> <ul> <li v-for="(item, index) in list" :key="index"> {{ item }}{{ index }}{{ list[index] }} </li> </ul> </div></template><script>export default { name: "App", data() { return { list: ["张三", "李四", "王二"], }; },};</script>//对象<template> <div id="app"> <ul> <li v-for="(item, index) in list" :key="index"> {{ item }}{{ index }}{{ list[index] }} </li> </ul> </div></template><script>export default { name: "App", data() { return { list: { a: "张三", b: "李四", c: "王二", }, }; },};</script>//对象数组<template> <div id="app"> <ul> <li v-for="(item, index) in list" :key="index"> {{ item }}{{ index }}{{ item.name }} </li> </ul> </div></template><script>export default { name: "App", data() { return { list: [{ name: "张三" }, { name: "李四" }, { name: "王二" }], }; },};</script>数据初始化:由模板->虚构DOM->实在DOMkey作为虚构DOM中的一个标签属性,如果应用index作为key,在数据更新后新的虚构DOM会编排key不论更新的数据插入的地位,都是从0开始编排数据更新:新模板->新虚构DOM->Diff算法比拟前后的虚构DOM->实在DOM在比拟的过程中,如果应用index作为key,先依据key比照前后的DOM节点,因为key的从新编排,导致模板复用率低,并且在复用时还容易产生谬误如果应用数据的惟一标识作为key,生成新的虚构DOM时依据key来比照,不会有太大变动,只更新变动的局部,无变动的局部容易在key比对后复用v-for与v-if同时应用时,v-for的优先级高,这意味着会进行列表渲染而后再判断是否渲染 ...

October 3, 2021 · 3 min · jiezi

关于vue.js:vue组件的递归自调用代码思路分析

问题形容在咱们应用vue开发我的项目时,有时候须要用到递归思维去书写代码。在一些UI组件中,咱们也能够看到其中使用了递归的思维。比方:饿了么UI中的el-tree组件、el-menu组件(动静菜单栏)、el-Cascader组件。所以本文就举个简略的例子,来记录一下递归思维,在vue组件中的应用。 什么是递归咱们晓得,一个函数能够调用别的函数,让别的函数执行;而递归就是:某个函数不去调用别的函数了,只调用本人,让本身函数始终执行。当然如果始终执行的话,会导致栈溢出问题,所以递归须要有一个完结的条件,当达到这个条件的时候,就让函数不再调用本身,就停下来即可。感觉和循环有点相似 递归、循环、死循环的了解递归:有限套娃,当找到某个娃娃时,就不套了循环:始终套娃,要把所有的娃娃都套了一遍,才停止下来不套了死循环:始终套娃,然而娃娃始终套不完这里是我集体的简略了解,具体区别,以官网为准vue组件中应用递归效果图 代码局部App.vue组件入口页面代码<template> <div> <!-- 传递数据到用来做递归的组件 --> <tree :data="data"></tree> </div></template><script>// 引入递归组件import tree from "./tree.vue";export default { name: "App", components: { tree }, // 注册递归组件 data() { return { /* 假如data是咱们向后端发申请获取的数据, 咱们须要把这个数据通过props的形式传递给用来做递归组件的.vue文件 这里要留神一下数据字段构造(理论工作中这里须要和后端磋商定规定) */ data: [ { name: "西游记", children: [ { name: "孙悟空", children: [ { name: "筋斗云", }, { name: "金箍棒", }, { name: "紧箍咒", }, ], }, { name: "沙和尚" }, { name: "白龙马" }, { name: "唐僧" }, ], }, { name: "三国演义", children: [ { name: "刘备" }, { name: "关羽", children: [ { name: "一技能" }, { name: "二技能" }, { name: "大招" }, ], }, { name: "张飞", }, { name: "小鲁班", children: [ { name: "福禄兄弟" }, { name: "木偶奇遇记" }, { name: "电玩小子" }, { name: "星空幻想" }, { name: "狮舞西方" }, { name: "乒乓小将" }, ], }, ], }, { name: "水浒传", children: [ { name: "宋江" }, { name: "鲁智深" }, { name: "武松", children: [ { name: "喝酒", }, { name: "打老虎", }, ], }, ], }, ], }; },};</script>tree.vue递归组件中的代码正文如下图: ...

October 2, 2021 · 2 min · jiezi

关于vue.js:电子屏数字展示组件开发

电子屏数字组件将数字转化成电子屏数字的模式展现,效果图如下: 效果图 预览地址预览地址 组件开发设计思路数字的主体是一个二维数组组成的图形,通过数组中的值来管制具体块的展现模式。 //如0的实质是这样的一个二维数组[[1,1,1],[1,0,1],[1,0,1],[1,0,1],[1,1,1]]入参//要转化的数字numbers: { type: Array, default: [0,22]},//数字主体色彩numberColor: { type: String, default: 'black'},//数字尺寸numberSize:{ type: String, default: '1rem'}次要函数将数字转换为二维数组getNumber(num){ switch (num.toString()){ case '0': return [ [1,1,1], [1,0,1], [1,0,1], [1,0,1], [1,1,1], ]; break; case '1': return [ [0,1,0], [0,1,0], [0,1,0], [0,1,0], [0,1,0], ]; break; ……………… ……………… default : break; } return [];}批改块元素款式rowStyle(row){ let res = `width:calc(${this.numberSize}/5);height:calc(${this.numberSize}/5);`; if(row == 1){ res += `background-color: ${this.numberColor};`; } return res; },将字符串转换成二维数组getShowNum(num){ num = num.toString(); let res = []; for(let i = 0; i < num.length; i++){ let temp = this.getNumber(num[i]); if(num[i] != 1){ for(let j = 0; j < temp.length; j++){ temp[j].push(0); } } if(res.length == 0) res = temp; else{ for(let j = 0; j < res.length; j++){ res[j] = res[j].concat(temp[j]); } } } return res; }残缺代码html<template> <div class="numbers-style"> <div v-for="(number,numberIndex) in numbers" :key="numberIndex" class="number-style"> <div v-for="(column,columnIndex) in getShowNum(number)" :key="columnIndex" class="column" > <div v-for="(row,rowIndex) in column" :key="rowIndex" class="cell" :style="rowStyle(row)"> </div> </div> </div> </div></template>JavaScript<script>export default { name: "electronicNumber", props: { numbers: { type: Array, default: [0,22] }, numberColor: { type: String, default: 'black' }, numberSize:{ type: String, default: '1rem' } }, data() { //这里存放数据", return { showNum:[] }; }, //监听属性 相似于data概念", computed: {}, //监控data中的数据变动", watch: {}, mounted(){ }, //办法汇合", methods: { getNumber(num){ switch (num.toString()){ case '0': return [ [1,1,1], [1,0,1], [1,0,1], [1,0,1], [1,1,1], ]; break; case '1': return [ [0,1,0], [0,1,0], [0,1,0], [0,1,0], [0,1,0], ]; break; case '2': return [ [1,1,1], [0,0,1], [1,1,1], [1,0,0], [1,1,1], ]; break; case '3': return [ [1,1,1], [0,0,1], [1,1,1], [0,0,1], [1,1,1], ]; break; case '4': return [ [1,0,1], [1,0,1], [1,1,1], [0,0,1], [0,0,1], ]; break; case '5': return [ [1,1,1], [1,0,0], [1,1,1], [0,0,1], [1,1,1], ]; break; case '6': return [ [1,1,1], [1,0,0], [1,1,1], [1,0,1], [1,1,1], ]; break; case '7': return [ [1,1,1], [0,0,1], [0,0,1], [0,0,1], [0,0,1], ]; break; case '8': return [ [1,1,1], [1,0,1], [1,1,1], [1,0,1], [1,1,1], ]; break; case '9': return [ [1,1,1], [1,0,1], [1,1,1], [0,0,1], [1,1,1], ]; break; case ':': return [ [0,0,0], [0,1,0], [0,0,0], [0,1,0], [0,0,0], ]; break; case '.': return [ [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,1,0], ]; break; case '/': return [ [0,0,0], [0,0,1], [0,1,0], [1,0,0], [0,0,0], ]; break; case '\\': return [ [0,0,0], [1,0,0], [0,1,0], [0,0,1], [0,0,0], ]; break; case '+': return [ [0,0,0], [0,1,0], [1,1,1], [0,1,0], [0,0,0], ]; break; case '-': return [ [0,0,0], [0,0,0], [1,1,1], [0,0,0], [0,0,0], ]; break; case '=': return [ [0,0,0], [1,1,1], [0,0,0], [1,1,1], [0,0,0], ]; break; case ' ': return [ [0], [0], [0], [0], [0], ]; break; default : break; } return []; }, rowStyle(row){ let res = `width:calc(${this.numberSize}/5);height:calc(${this.numberSize}/5);`; if(row == 1){ res += `background-color: ${this.numberColor};`; } return res; }, getShowNum(num){ num = num.toString(); let res = []; for(let i = 0; i < num.length; i++){ let temp = this.getNumber(num[i]); if(num[i] != 1){ for(let j = 0; j < temp.length; j++){ temp[j].push(0); } } if(res.length == 0) res = temp; else{ for(let j = 0; j < res.length; j++){ res[j] = res[j].concat(temp[j]); } } } return res; } },}</script>CSS<style lang="scss" scoped> .numbers-style{ display: flex; flex-wrap: wrap; .number-style{ flex-wrap: wrap; .column{ display: flex; .black{ background-color: black; } } } }</style>代码地址Gitee ...

October 2, 2021 · 3 min · jiezi

关于vue.js:js常有正则表达式

vue 限度只能输出名称32位中文,手机号11位数字,验证码6位数字 watch: { 'bindForm.name'(val) { let pattern = /[^\u4e00-\u9fa5]+/ this.bindForm.name = val.replace(pattern, '') if (val.length > 32) { this.bindForm.name = val.substring(0, 32) } this.checkIsComplete() }, 'bindForm.phone'(val) { if (val.length > 11) { this.bindForm.phone = val.substring(0, 11) } this.checkIsComplete() }, 'bindForm.code'(val) { if (val.length > 6) { this.bindForm.code = val.substring(0, 6) } this.checkIsComplete() }, }获取地址栏参数function getQueryString(name) { var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i') var reg_rewrite = new RegExp('(^|/)' + name + '/([^/]*)(/|$)', 'i') var r = window.location.search.substr(1).match(reg) var q = window.location.pathname.substr(1).match(reg_rewrite) if (r != null) { return unescape(r[2]) } else if (q != null) { return unescape(q[2]) } else { return null } }

October 1, 2021 · 1 min · jiezi

关于vue.js:vueVue实例上的方法

Vue实例上的办法数据事件生命周期1 数据vm.$watchvm.$setvm.$delete1.1 vm.$watch(exp,callback,options)exp:String|Functioncallback:参数newVal,oldValoptions:{immediate,deep}察看Vue实例一个表达式或函数计算结果的变动,自身会返回一个勾销察看的函数,调用后勾销察看 <template> <div id="app"> <span>{{ bar.foo }}</span> <button @click="add">+</button> <span>原始值:{{ oldVal }}</span> <span>原始值:{{ newVal }}</span> </div></template><script>export default { name: "App", data() { return { bar: { foo: 0, }, oldVal: "", newVal: "", }; }, computed: { barCom() { return JSON.parse(JSON.stringify(this.bar)); }, }, methods: { add() { this.bar.foo += 1; }, }, mounted() { this.$watch( "barCom", function (newVal, oldVal) { this.newVal = newVal.foo; this.oldVal = oldVal.foo; }, ); },};</script>深度监听一个对象时,能够应用计算属性进行序列化与反序列化,不应用deep选项也能够实现深度监听用deep深度监听时,只是监听到变动,oldVal与newVal都是最新的值不应用深度监听,间接监听到具体属性能够检测变动前后的值,而后进行解决1.2 vm.$set(target,key,value) vm.$delete(target,key)增加或批改响应式对象的property,target不能是Vue实例或者Vue实例的根数据对象性能与Vue.set()和Vue.delete()统一Vue.set()和Vue.delete() ...

September 30, 2021 · 1 min · jiezi

关于vue.js:vue-cdn配置

// config/cdn.jsconst cdn = { css: [ // 'https://cdn.jsdelivr.net/npm/vant@2.8/lib/index.css' ], js: [ 'https://cdn.bootcss.com/vue/2.5.2/vue.min.js', 'https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js', 'https://cdn.bootcss.com/vuex/3.0.1/vuex.min.js' ]}module.exports = cdn// webpack.config.jsplugins: [ new HtmlWebpackPlugin(Object.assign({ filename: 'index.html', template: 'index.html', inject: true }, config.cdn))]<!--index.html--><body> <div id="app"> <!-- shell --> </div> <script src="./static/js/axios.min.js"></script> <% for (var i in htmlWebpackPlugin.options.js&&htmlWebpackPlugin.options.js) { %> <script src="<%= htmlWebpackPlugin.options.js[i] %>"></script> <% } %> <!-- built files will be auto injected --></body>

September 30, 2021 · 1 min · jiezi

关于vue.js:vue项目中animatecss的使用

装置animate.cssnpm install animate.css@3.7.2 --save 在main.js引入 import 'animate.css'标签的class中,写上对应的参数(animated shake fast) <div v-if="isError" class="tips animated shake fast">第二个参数对应动画类名,可参考查看动画类名 留神:animate的版本和应用形式要一一对应,不然会呈现引入后动画不失效的状况(依照以上步骤亲测能够失常应用动画)

September 30, 2021 · 1 min · jiezi

关于vue.js:vueawesomeswiper使用方法避免踩坑

正确的应用姿态:装置(指定版本)npm install vue-awesome-swiper@3 --save-dev 应用办法<template> <div class="recommendPage"> <swiper :options="swiperOption" ref="mySwiper"> <swiper-slide>I'm Slide 1</swiper-slide> <swiper-slide>I'm Slide 2</swiper-slide> <swiper-slide>I'm Slide 3</swiper-slide> <div class="swiper-pagination" slot="pagination"></div> <div class="swiper-button-prev" slot="button-prev"></div> <div class="swiper-button-next" slot="button-next"></div> </swiper> </div></template><script>// 引入插件import { swiper, swiperSlide } from "vue-awesome-swiper";import "swiper/dist/css/swiper.css";export default { components: { swiper, swiperSlide }, data() { return { swiperOption: { loop: true, autoplay: { delay: 3000, stopOnLastSlide: false, disableOnInteraction: false }, // 显示分页 pagination: { el: ".swiper-pagination", clickable: true //容许分页点击跳转 }, // 设置点击箭头 navigation: { nextEl: ".swiper-button-next", prevEl: ".swiper-button-prev" } } }; }, computed: { swiper() { return this.$refs.mySwiper.swiper; } }, mounted() { // current swiper instance // 而后你就能够应用以后上下文内的swiper对象去做你想做的事了 console.log("this is current swiper instance object", this.swiper); // this.swiper.slideTo(3, 1000, false); }};</script><style scoped >.recommendPage .swiper-container{ position: relative; width: 100%; height: 200px; background: pink;} .recommendPage .swiper-container .swiper-slide{ width: 100%; line-height: 200px; background: yellowgreen; color: #000; font-size: 16px; text-align: center;}</style>

September 30, 2021 · 1 min · jiezi

关于vue.js:vueVue实例上的属性

Vue实例上的属性vm.$datavm.$propsvm.$elvm.$refsvm.$optionsvm.$parentvm.$childrenvm.$rootvm.$slotsvm.$scopedSlotsvm.$isServervm.$attrsvm.$listeners1 vm.$dataVue实例察看的数据对象。Vue实例代理了对其property的拜访包含mixin和extend的data 2 vm.$props以后组件接管到的props对象。Vue实例代理了对其property的拜访 3 vm.$elVue实例应用的根DOM元素 4 vm.$refs持有注册过ref的所有DOM元素和组件实例组件外部有ref的DOM拜访不到 5 vm.$options以后Vue实例的初始化选项能够通过vm.$options去拜访自定义的属性 6 vm.$root以后组件树的根Vue实例,若以后实例没有父实例,此实例将是其本人。 7 vm.$parent vm.$children返回以后实例的父实例与间接子组件$chidren并不保障程序,也不是响应式的 8 vm.$slots拜访被插槽散发的内容,非响应式返回一个对象,蕴含插槽的Vnode数组 //父组件<template> <div id="app"> <Child> <template v-slot:slot1> 具名1 </template> <template v-slot:slot2> <span>具名2</span> <span>具名2</span> </template> <span>默认</span> </Child> </div></template>//子组件<template> <div> <slot></slot> <slot name="slot1"></slot> <slot name="slot2"></slot> </div></template><script>export default { mounted() { console.log(this.$slots); },};</script> 9 vm.$scopedSlots能够拜访作用域插槽,以及默认插槽和具名插槽。返回一个对象,插槽为函数模式,返回Vnode数组 //子组件<template> <div> <slot></slot> <slot name="slot1"></slot> <slot name="slot2"></slot> <slot name="slot3" :list="list"></slot> </div></template><script>export default { data() { return { list: ["a", "b", "c"], }; }, mounted() { console.log(this.$slots); console.log(this.$scopedSlots); },};</script>//父组件<template> <div id="app"> <Child> <template v-slot:slot1> 具名1 </template> <template v-slot:slot2> 具名2 </template> <span>默认</span> <template v-slot:slot3="{ list }"> <span v-for="(item, index) in list" :key="index">{{ item }}</span> </template> </Child> </div></template>如果拜访slot3,this.$scopedSlots.slot3()会返回undefined,v-for生成的标签拜访不到 ...

September 30, 2021 · 1 min · jiezi

关于vue.js:vueelement-动态表单对输入框elinput-输入校验只能输入数字和小数点

动静表单,校验只能输出数字和小数点 1.咱们晓得, 对原生的input 输出校验是: <input onkeyup="value=value.replace(/[^\d]/g, '')" />2.那对element 组件input 的校验, 就得用它的对应事件了 <el-input placeholder="请输出ip" v-model="formData.ip" @input="validIp" ></el-input>validIp(val){ this.formData.ip = value.replace(/[^\d.]/g, '')}3.那么, 是动静的input 呢, 我这里实现了一个计划。就是在校验办法中, 把input #id 传过来,id中含index 下标信息, 通过document.getElementById(#id) 获取value <el-input placeholder="请输出ip" :id="'ip_'+index" v-model="formData.ips[index]" @input="validIp('ip_'+index)" ></el-input>validIp(inputId){ let index = inputId.split("_")[1] let dom = document.getElementById(inputId) let temp = dom.value temp = temp.replace(/[^\d.]/g, "") this.formData.ips[index]=temp },

September 30, 2021 · 1 min · jiezi

关于vue.js:vueVue中的选项

Vue中的选项数据DOM生命周期钩子资源组合其余1 数据datapropspropsDatamethodswatch1.1 dataVue实例的数据对象 在初始化时,Vue会递归地把data的property转换为getter/setter,可能响应数据变动,以_和$结尾的property不会被解决组件中的data必须返回一个初始数据对象的函数,如果是一个对象,组件创立的多个实例会共享援用这个数据对象。1.2 computed计算属性对象函数模式的属性:仅读取对象模式的属性:通过set/get函数读取和设置 data() { return { a: 1, }; }, computed: { fnA() { return this.a * 2; }, oA: { get() { return this.a + 1; }, set(newVal) { this.a = newVal * 2; }, }, }, mounted() { console.log(this.fnA); //2 console.log(this.oA); //2 console.log(this.a); //1 this.oA = 2; console.log(this.oA); //5 console.log(this.a); //4 console.log(this.fnA); //8 },1.3 methods办法对象混入到Vue实例中,能够间接通过vm实例拜访这些办法,或者在指令表达式中应用。办法中的this主动绑定为Vue实例 1.4 watch设置数据侦测的对象 函数与字符串模式 data() { return { a: 1, b: { c: "bar" }, };},watch: { a: "show", b: "show",},methods: { show(val, oldVal) { console.log(val, oldVal); },},mounted() { this.a = 2; //2 1 this.b.c = 2;},函数模式就是把字符串替换为函数,不能深度侦测对象模式 ...

September 29, 2021 · 3 min · jiezi

关于vue.js:vue项目阻止浏览器后退操作

应用history.pushState(state, title, url)办法参数state 状态对象是一个JavaScript对象,它与pushState()创立的新历史记录条目相关联。 每当用户导航到新状态时,都会触发popstate (en-US)事件,并且该事件的状态属性蕴含历史记录条目标状态对象的正本。状态对象能够是任何能够序列化的对象。 因为Firefox将状态对象保留到用户的磁盘上,以便用户重新启动浏览器后能够将其还原,所以咱们对状态对象的序列化示意施加了640k个字符的大小限度。 如果将序列化示意模式大于此状态的状态对象传递给pushState(),则该办法将引发异样。 如果您须要更多空间,建议您应用 sessionStorage或者localStorage。title 以后大多数浏览器都疏忽此参数,只管未来可能会应用它。 在此处传递空字符串应该能够避免未来对办法的更改。 或者,您能够为要挪动的状态传递简短的题目。url 可选 新历史记录条目标URL由此参数指定。 请留神,浏览器不会在调用pushState() 之后尝试加载此URL,但可能会稍后尝试加载URL,例如在用户重新启动浏览器之后。 新的URL不用是相对的。 如果是绝对的,则绝对于以后URL进行解析。 新网址必须与以后网址雷同 origin; 否则,pushState()将引发异样。 如果未指定此参数,则将其设置为文档的以后URL。联合vue-router钩子函数,将url设定为以后页面的url。 我本人在实战中的代码: beforeRouteUpdate(to,from,next){ //判断是不是点击的后退按钮 ,当点击后退按钮的时候以后url和to.fullPath 一样 if((location.pathname+location.search)==to.from.fullPath){ history.pushState(null,null,location.href); return }}完结!欢送指教,虚心好学!

September 29, 2021 · 1 min · jiezi

关于vue.js:浅谈VUE中的过滤器

过滤器实质就是一种办法其实,过滤器实质就是一种办法,这不难理解,形象一点来说,过滤器就像化学试验中的漏斗,过滤掉没有用的杂质,提取本人想要的物质。形象一点来讲过滤器就是在vue中是以约定好的格局进行代码的编写并且实现相干的性能一种非凡办法。然而理论过程中vue过滤器并不像实在的漏斗实现简略过滤那么简略,通常来讲,实在的漏斗是在现有根底上,过滤出来现有的货色,能够疏忽的是物质自身不产生扭转,这只是一个简略的过滤。而vue中过滤器能够了解为深度的(简单的)过滤,能够认为,vue中过滤器既能够在现有根底上,过滤出来现有的数据,数据自身不产生扭转,也能够为了失去预期的数据,做出一些扭转,也就是说过滤即是扭转,这种扭转是可预知的,用具体方法实现的。 过滤器编写常见通用模板过滤器实现展现代码<!-- 在双花括号中 -->{{ 须要过滤的变量 | 过滤器名称 }}<!-- 在 `v-bind` 中 --><div v-bind:id="须要过滤的变量 | 过滤器名称"></div>//过滤器个别用在Mustache语法又叫大括号语法中居多//须要过滤的变量个别就是展现的数据//过滤器名称实质就是办法名,上文提到过滤器也是一种非凡的办法本地过滤器实现性能代码 filters: { 过滤器名称: function (val) { //这个局部就是过滤器办法实现的过程,这取决于你想要的成果 }}全局过滤器实现性能代码 Vue.filter('过滤器名称', function(参数) { //这个局部就是过滤器办法实现的过程,这取决于你想要的成果})123全局过滤器编写真是案例工夫戳转换为规范的工夫过滤器实现展现代码{{须要过滤的变量 | dateFormat}}//过滤器个别用在Mustache语法又叫大括号语法中//须要过滤的变量个别就是展现的数据//过滤器的名称实质就是办法名,上文提到过滤器也是一种非凡的办法过滤器实现性能代码 Vue.filter('dateFormat', function(Val) { const dt = new Date(Val) const y = dt.getFullYear() const m = (dt.getMonth() + 1 + '').padStart(2, '0') const d = (dt.getDate() + '').padStart(2, '0') const hh = (dt.getHours() + '').padStart(2, '0') const mm = (dt.getMinutes() + '').padStart(2, '0') const ss = (dt.getSeconds() + '').padStart(2, '0') return `${y}-${m}-${d} ${hh}:${mm}:${ss}`})过滤器中一种强化过滤器过滤器中一种强化过滤也就是官网提到的“过滤器能够串联”强化过滤器实现展现代码 ...

September 29, 2021 · 1 min · jiezi

关于vue.js:一行代码解决vue数据量大卡顿问题

最近遇到一个需要,须要在地图上显示某地区的路网线路,后果后端间接返回了3w多条数据 每条线路下坐标点靠近100个 这四舍五入就是300w的数据啊。 而且还不能分层级显示,只能一次性显示全副打点,没方法,硬着头皮放到地图上吧。 开发实现,关上网页,拖动地图,偶然呈现了卡顿的状况,然而,上线吧,能用就行 3天后 产品经理:诶,这数据怎么不会变啊,你加个轮询定时申请吧,还有地图能不能有点动态效果,隔一段时间随机定位到某个地点吧,而后地图打点点击要有具体数据的弹窗打工人:...加上轮询,关上网页,拖动地图,呈现了显著的掉帧和卡顿的状况,然而,上线吧,能用就行 一天后 产品经理:页面没怎么操作,怎么放着放着就崩了打工人:...关上控制台,关上工作管理器,发现首次加载页面内存就占用了靠近1G 第一次轮询,内存占用1.4G 第二次轮询,内存占用1.8G 每次轮询,内存占用就增大了400M,好家伙,这样上来1T的内存都不够用啊(况且一个tab内存占用到4G左右页面就解体了 这...不对啊,我明明地图对象都移除了,数据也是重置了啊,内存怎么始终在增大呢? 于是开始了修bug之路 通过重复调试和定位,发现是vue数据深度监听和地图对象存在援用关系导致内存无奈开释(狐疑)那这个问题好解决啊,禁用vue深度监听不就好了吗 因为本我的项目中申请的数据只用于展现,不会对数据作批改,所以只须要在赋值data前把数据解冻即可 this.list = Object.freeze(list)因为数据被解冻,所以vue无奈深度遍历数据给数据增加get和set属性,这样就缩小了数据监听带来的问题,而且在大数据量的状况下Object.freeze()十分有用 Object.freeze()办法能够解冻一个对象,一个被解冻的对象再也不能被批改,当然你能够将变量的援用替换掉 不能增加新属性不能删除已有属性不能批改已有属性的可枚举性、可配置性、可写性不能批改已有属性的值不能批改原型

September 29, 2021 · 1 min · jiezi

关于vue.js:Vue项目通过jsonp跨域登录后iframe加载页面

问题形容:共事我的项目要通过iframe援用其余零碎的页面,然而援用之前要主动登录对方零碎,不然间接用iframe援用的话会被对方零碎强制登出。解决方案:引入vue-jsonp,通过jsonp解决跨域登录后,iframe加载指标页面。 一、vue引入vue-jsonp npm install vue-jsonp --save-dev二、援用 import Vue from 'vue'import {VueJsonp} from 'vue-jsonp' //留神大写和大括号Vue.use(VueJsonp)三、应用 // html<iframe :src="iframeurl" frameborder="0"></iframe>// jsgetJson() { this.$jsonp(url, { code: '**', password: '**' }) .then((json) => { this.iframeUrl = 'iframeUrl' }) },

September 28, 2021 · 1 min · jiezi

关于vue.js:递归子项新增某个属性

const ass = (data) => { data.map((list, i) => { list.alwaysShow = true if (list.children && list.children != null) { ass(list.children) } }) return data}

September 28, 2021 · 1 min · jiezi

关于vue.js:element-ui中的select多选问题

在应用select下拉框多选时,在编辑用户角色时,编辑界面为select下拉框的model赋值了,抉择的数据有问题,输入框中的值不能与下拉框的值对应上。 如图: 解决: <el-select ref="select" v-model="roles" placeholder="请抉择用户角色" @change="$forceUpdate()" class="el-select" multiple clearable><el-option v-for="item in roleData" :label="item.role" :value="item.serial" :key="item.serial"></el-option></el-select>//编辑 editBtn(row) { this.addForm = { ...row } console.log(row); let arr = [] for(const data of row.resourceList) { arr.push(data.serial) } console.log(arr) this.roles = arr; this.titleName = '编辑' this.dialogVisible = true; },下拉框中的数据源roleData是一个数组,选中后的值也是一个数组。然而在后端存储的时候是转换成字符串存到数据库中的,所以在编辑界面从后端获取的返回值是一个字符串,首选要把这个字符串转换成数组,绑定到select 的v-model属性上(留神:选中的值就是下拉框数据源中的serial)。 @change="$forceUpdate()"这是强制刷新 而后在提交的时候把这个数组转换成字符串赋给后盾指定的字段传给后盾就功败垂成啦。

September 28, 2021 · 1 min · jiezi

关于vue.js:vantnumberplate基于vuevantless的车牌号输入组件车牌号虚拟键盘

阐明这是一个vue挪动端车牌号输出组件,此组件依赖vant的van-action-sheet和van-button等组件,同时应用了less 效果图 演示地址手机扫码体验 点击查看演示应用示例示例一:只应用键盘,自定义显示组件 <template> <div> <h3>示例一</h3> <van-cell-group> <van-field :value="value" readonly label="车牌号" @click="show = true" /> </van-cell-group> <vnp-keyboard v-model="value" :show.sync="show"></vnp-keyboard> </div></template><script>import Keyboard from '@/components/vant-number-plate/vnp-keyboard';export default { components: { 'vnp-keyboard': Keyboard, }, data() { return { show: false, value: '川A' } }}</script><style lang="less" scoped> h3 { padding: 0 30px; }</style>示例二:应用提供的显示组件 <template> <div> <h3>示例二</h3> <div class="demo-two-box"> <vnp-input v-model="value"></vnp-input> </div> </div></template><script>import VnpInput from '@/components/vant-number-plate/vnp-input';export default { components: { 'vnp-input': VnpInput }, data() { return { value: '川A' } }}</script><style lang="less" scoped> .demo-two-box { padding: 0 30px; } h3 { padding: 0 30px; }</style>点击查看源码

September 28, 2021 · 1 min · jiezi

关于vue.js:router和route的区别路由跳转方式name-path-和传参方式params-query的区别

一、$router和$route的区别$router : 是路由操作对象,只写对象$route : 路由信息对象,只读对象 //$router操作 路由跳转 // 字符串 this.$router.push('home')// 对象 this.$router.push({ path: 'home' })// 命名的路由 this.$router.push({ name: 'user', params: { userId: 123 }})// 带查问参数,变成 /register?plan=123 this.$router.push({ path: 'register', query: { plan: '123' }})//$route读取 路由参数接管var name = this.$route.params.name; 二、params 、query的区别 1.this.$route.query的应用 A、传参数: this.$router.push({ path: '/monitor', query:{ id:id, }})B、获取参数:this.$route.query.idC、在url中模式(url中带参数) http://172.19.186.224:8080/#/monitor?id=1D、页面之间用路由跳转传参时,刷新跳转后传参的页面,数据还会显示存在(我的项目中遇到此问题) 2.this.$route.params的应用A、传参数: this.$router.push({ name: 'monitor', params:{ id:id, }})B、获取参数:this.$route.params.idC、在url中模式(url中不带参数)http://172.19.186.224:8080/#/monitorD、页面之间用路由跳转传参时,刷新跳转后传参的页面,数据不存在(我的项目中遇到此问题) 三、name 、 path的区别 path 和 Name路由跳转形式,都能够用query传参path路由跳转形式,params传参会被疏忽,只能用name命名的形式跳转params传参,push外面只能是 name:'xxxx',不能是path:'/xxx',因为params只能用name来引入路由,如果这里写成了path,接管参数页面会是undefined!!!另外,二者还有点区别,直白的来说query相当于get申请,页面跳转的时候,能够在地址栏看到申请参数,而params相当于post申请,参数不会再地址栏中显示 留神:params传参如果路由下面不写参数,也是能够传过来的,但不会在url下面显示出你的参数,并且当你跳到别的页面或者刷新页面的时候参数会失落,要怎么解决?

September 28, 2021 · 1 min · jiezi

关于vue.js:vueVue上的API

Vue上的APIVue.extendVue.componentVue.useVue.setVue.deleteVue.directiveVue.filterVue.nextTickVue.mixinVue.compileVue.observableVue.version1 Vue.extend({options})通过Vue创立一个子类,参数是一个组件选项的对象data选项必须是函数 在初始化时会判断data是函数还是对象函数:执行这个函数,返回一个新对象对象:间接应用这个对象,那么实例化这个子类时,这个对象是私有的,全局净化//创立子类const myVue = Vue.extend({ template: '<p>衬衫的价格是{{price}}</p>', data() { return { price: "九磅十五便士" } },})//实例化子类并挂载const myVm1 = new myVue().$mount("#root1")const myVm2 = new myVue({ el: "#root2" })//后果<p>衬衫的价格是九磅十五便士</p><p>衬衫的价格是九磅十五便士</p>动静渲染组件,能够像调用函数一样调用组件2 Vue.component(id , [definition])定义组件,组件是一个可复用的Vue实例,能够作为自定义元素来应用definition能够是Vue.extend(options),也能够间接使一个options对象-还是会执行Vue.extend() //定义一个组件Vue.component('Child1', { template: `<p>衬衫的价格是{{price}}</p>`, data() { return { price: "九磅十五便士", } },})new Vue().$mount('#root1')//定义子类const myVue = Vue.extend({ template: `<p>我的名字叫{{name}}</p>`, data() { return { name: "韩梅梅" } },})Vue.component('Child2', myVue)new Vue().$mount('#root2')<div id="root1"> <Child1></Child1></div><div id="root2"> <Child2></Child2></div>下面两种形式都能够去自定义一个组件3 Vue.use(plugin)装置插件,通常在装置一个包之后想在Vue中应用,须要先引入而后Vue.use后才能够应用,Vue.use会调用该模块中的install形式应用use的形式定义组件,模拟插件的装置过程 //MyComponent.vue文件<template> <div>正在加载中...</div></template>//创立index.js 进行封装import MyComponent from './MyComponent.vue'const My = { install(Vue) { Vue.component('My', MyComponent) }}export default My//在main.js中装置import My from './components/index'Vue.use(My)//在其余组件中援用<My />use其实就是调用install,而后返回4 Vue.set(target,key,value) Vue.delete(target,key)增加或批改响应式对象的property,target不能是Vue实例或者Vue实例的根数据对象 ...

September 27, 2021 · 2 min · jiezi

关于vue.js:解放前端生产力一手打造自己的表单代码生成器

本文指标:手摸手教你打造一个反对内嵌网页的VS Code插件,实现Vue我的项目前端表单代码的主动生成,早日实现摸鱼自在。成果展现废话不多说,先看看最终的工作成绩: 看完动图是不是提神了那么一丢丢,让咱们开干吧~~ 第一步/Step 1首先,咱们须要一款开源、拖拽式设计的可视化设计器,GitHub、码云一通搜寻,曾经有很多成品了,各种form-create、form-design、vue-form、form-generator等等;<br/> 其次,从上述设计器中筛选反对代码生成的,当然如果没有代码生成也能够本人实现,毕竟都开源了不是? 我这里抉择的是开源的VForm设计器:VForm GitHub为啥咧?哈哈。。。看着眼生呗,性能上多那么一丢丢~~ 第二步/Step 2装置VS Code插件开发套件: npm install -g yo generator-code装置胜利后,运行yo code生成新的插件我的项目: 起个简略又好听的名字——quick-coder(撸码达人),加个简略的阐明,其余选项按需抉择即可。 来来来,看一下生成的插件我的项目: 这里只须要重点关注两个文件:extension.js、package.json extension.js,插件扩大点形容文件package.json,我的项目属性、依赖包及插件配置文件第二步工作告一段落,接下来开始第三步插件的编码实现工作。 第三步/Step 3批改package.json,以减少插件的启动命令,能够从命令面板和左侧资源管理器启动。 "contributes": { "commands": [{ "command": "extension.openVFormMaker", "title": "关上VForm设计器" }], "menus": { "explorer/context": [{ "command": "extension.openVFormMaker", "group": "navigation" }] }},批改extension.js的插件启用办法,仅一行: function activate(context) { require('./src/vform-loader')(context)}截止到此时,咱们尚未解释整个代码生成器插件是如何工作的,但当初到了不得不说的时候了。咱们心愿,当插件启动的时候关上一个WebView面板,WebView面板通过URL配置参数加载VForm网页,当VForm生成代码时与VS Code通过postMessage通信,VS Code负责将生成代码保留为本地文件。实现上述需要的要害代码都在vform-loader.js文件中。 这里还有两个小问题须要解答: WebView能间接加载近程网页吗?答案是不能,只能加载本地HTML文件。那么问题来了?WebView怎么加载远端网页的HTML呢?答案也很简略,就是在本地HTML文件内嵌入iframe,iframe万能——YYDS!解决了上述几个小case,咱们来看看整个插件的灵魂代码。 src\view\index.html <!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width,initial-scale=0,maximum-scale=0,user-scalable=yes,shrink-to-fit=no" /> <title>Quick Coder</title> </head> <body> <iframe id="frame" width="100%" height="100%" frameborder="0"></iframe> <script> window.onload = function () { const vscode = acquireVsCodeApi(); const cmds = { setSrc: function (message) { var frame = document.getElementById("frame"); frame.src = message.data.src; }, writeFile: function (message) { vscode.postMessage(message); }, openUrl: function (message) { vscode.postMessage(message); }, setStorageItem: function (message) { vscode.postMessage(message); }, }; window.addEventListener("message", (event) => { const message = event.data; if (message && message.cmd) cmds[message.cmd](message); }); }; </script> </body></html>src\vform-loader.js ...

September 27, 2021 · 3 min · jiezi

关于vue.js:Vue项目-首屏加载优化方案总结

优化计划如下:1. Vue-Router路由懒加载(利用Webpack的代码切割) 2. 应用CDN减速,将通用的库从vendor进行抽离 3. Nginx的gzip压缩 4. Vue异步组件 5. 服务端渲染SSR 6. 如果应用了一些UI库,采纳按需加载 7. Webpack开启gzip压缩 8. 如果首屏为登录页,能够做成多入口 9. Service Worker缓存文件解决 10. 应用link标签的rel属性设置 prefetch(这段资源将会在将来某个导航或者性能要用到,然而本资源的下载程序权重比拟低,prefetch通常用于减速下一次导航)、preload(preload将会把资源得下载程序权重进步,使得要害数据提前下载好,优化页面关上速度)

September 26, 2021 · 1 min · jiezi

关于vue.js:一个不能吃的中秋月饼

海上生明月,天涯共此时. ----《望月怀远》(唐·张九龄) 不觉间又到了中秋季节,置信宽广敌人们都收到了公司或其余敌人送来的月饼,我置信没有人不期待中秋(假期)的降临。 “小饼如嚼月,中有酥与饴”说的就是美味的月饼,既然月饼如此深得大家的青睐,明天咱们就用canvas画一个月饼,送个显示器前的你。 这次应用的技术栈是vue + vite 进行开发编辑工作的,(就是简略的html+css)这么简略的性能当然应该应用动态html的啦,请各 位敌人怎么不便怎么来吧~目录构造 开始绘制(1)第一步绘制一个富裕中国元素的背景(有点密集恐惧症) canvas {width: 100%; height: 100%; background-image: repeating-radial-gradient(circle at center center, transparent 0px, transparent 8px, rgba(255, 255, 255, 0.05) 8px, rgba(255, 255, 255, 0.05) 11px, transparent 11px, transparent 17px, rgba(255, 255, 255, 0.05) 17px, rgba(255, 255, 255, 0.05) 25px, transparent 25px, transparent 38px, rgba(255, 255, 255, 0.05) 38px, rgba(255, 255, 255, 0.05) 42px), repeating-radial-gradient(circle at center center, rgb(230, 0, 0) 0px, ...

September 26, 2021 · 5 min · jiezi

关于vue.js:Vue-30组合式API

一、组合式API的核心思想将同一个逻辑关注点相干代码收集在一起。从而更好的共享和重用代码。接下来咱们以依据user加载列表组件并依据审批人筛选过滤组件来进行组合api的演示。1、这是userRepositories.vue组件提取过两个逻辑点的代码片段。 setup(props) { const user = toRefs(props) const { repositories, getUserRepositories } = useUserRepositories(user) const { searchQuery, repositoriesMatchingSearchQuery } = useRepositoryNameSearch(repositories) return { repositories, getUserRepositories, searchQuery, repositoriesMatchingSearchQuery, } }借助setup 选项是一个接管 props,并将 setup 返回的所有内容都裸露给组件的其余部分 (计算属性、办法、生命周期钩子等等) 以及组件的模板个性。咱们最终要裸露给残余组件的属性有repositories 列表组件数据汇合、getUserRepositories获取列表组件的办法、searchQuery搜寻条件、repositoriesMatchingSearchQuery依据搜寻条件失去的过滤组件数据汇合。 2、接下来咱们先把第一个逻辑点提取进去、咱们把依据用户获取列表的逻辑放入useUserRepositories.js中 import { fetchUserRepositories } from '@/api/combined.js'import { ref, onMounted, watch } from 'vue'export default function useUserRepositories(user) { let repositories = ref([]) const getUserRepositories = async () => { let result = await fetchUserRepositories(user) repositories.value = result.data } onMounted(getUserRepositories) watch(user, getUserRepositories) return { repositories, getUserRepositories, }}咱们借助带ref的响应式变量repositories作为列表汇合的存储变量、通过watch在user发生变化时调用getUserRepositories函数获取repositories列表汇合。并在onMounted周期函数中初始化列表。最终返回repositories列表和getUserRepositories更新列表的函数。上图的组件列表就是依据user获取到的列表数据3、接下来咱们来提取第二个逻辑关注点:依据审批人搜寻失去过滤组件、咱们把逻辑代码提取至useRepositoryNameSearch.js中 ...

September 26, 2021 · 1 min · jiezi

关于vue.js:vue项目不同系统重装依赖

1、Windowsnpm install -g rimraf // 装置rimraf工具rimraf node_modules // 删除node_modulesrimraf package-lock.json // 删除package-lock.json2.linuxrm -rf node_modules // 删除node_modulesrm package-lock.json // 删除package-lock.json3、清缓存(非必须,命令不分系统)npm cache clear --force4、装置依赖npm install

September 26, 2021 · 1 min · jiezi

关于vue.js:VUE组件切换方式

1、v-if & v-else和标识符flaghtml( < template > ): <div id="app"> <input type="button" value="toggle" @click="flag=!flag"> <my-com1 v-if="flag"></my-com1> <my-com2 v-else="flag"></my-com2></div>js: export default { name: 'name', return data: { flag: true }, methods: {}}2、:is<component :is="组件名"/>3、设置切换动画<template> <transition mode="out-in"> <component :is="comName"></component> </transition></template><style> .v-enter, .v-leave-to { opacity: 0; transform: translateX(150px); } .v-enter-active, .v-leave-active { transition: all 0.5s ease; } </style>

September 26, 2021 · 1 min · jiezi

关于vue.js:npm换源

npm换源在应用npm命令进行相干操作时,速度较慢,这时可应用换源或者应用cnpm解决 一、更换下载源常见的有两种办法,上面以淘宝源为示例 1.长期应用 npm --registry https://registry.npm.taobao.org install xxx2.永恒应用 npm config set registry https://registry.npm.taobao.org配置实现后应用如下命令查看是否配置胜利 npm config get registry二、应用cnpm命令通过如下命令全局装置cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org装置实现后,即可应用cnpm命令,应用时用cnpm替换npm即可,如: cnpm install xxx

September 26, 2021 · 1 min · jiezi

关于vue.js:尤雨溪批判用户擅自部署-VueVite-中文文档Spring-Boot-255-正式版发布-思否周刊

40s 新闻速递微信PC端将反对主动登录搜狗发表与腾讯实现合并欧盟或强制电子设备应用通用充电器花呗将全面纳入央行征信零碎,用户回绝接入将无奈应用对于 Vue / Vite 中文文档国内的非官方部署库克谈整体员工大会泄密给媒体事件:将全力追究谷歌把印度反垄断机构告上法庭:非法泄露 750 页调查报告Django 4.0 alpha 1 公布Spring Boot 2.5.5 正式版公布.NET 6 中的 HTTP/3 反对Forest v1.5.3 正式版本公布Swift 5.5 公布行业资讯微信PC端将反对主动登录依据微博网友的音讯称,微信 Windows 客户端减少了新性能,在登录 PC端微信之后,在手机端上勾选“主动登录该设施”,下次登录微信就无需手机确认即可实现PC端的登录。在 PC 端的设置里,也有“主动登录”的选项开关,开启后,在本机登录微信将无需手机确认。 搜狗发表与腾讯实现合并搜狗公司发布公告发表与腾讯实现合并。合并实现后,搜狗将成为腾讯控股间接全资子公司,并实现退市。这也是自往年 7 月 13 日,国家市场监管总局无条件批准腾讯控股有限公司收买搜狗公司股权后,搜狗首次披露合并的进一步细节。 欧盟或强制电子设备应用通用充电器据报道,欧盟委员会星期四提出了一项法案,要求各电子产品制造商必须在手机、平板电脑等挪动电子产品上提供对立的充电器。该法案从 2009 年起就开始探讨,但因为受到一些厂商的拥护而迟迟没有停顿。 该法案将对苹果产生很大影响,目前 iPhone 用的仍是 Lightning 接口。苹果曾说过,如果强制将连接器对立成一种规格会妨碍翻新,还会制作出海量电子垃圾。 花呗将全面纳入央行征信零碎,用户回绝接入将无奈应用花呗布告接入征信工作的最新进展。布告显示,在央行征信治理部门的领导下,花呗正逐步推进接入央行征信零碎的工作。目前,在取得用户受权的根底上,局部用户曾经可能在本人的征信报告中查问到花呗记录,将来征信服务将逐渐笼罩全副用户。花呗征信信息将由重庆蚂蚁生产金融有限公司或单干银行等正规持牌金融机构作为报送主体。生产金融类产品接入征信系惯例动作,此前微粒贷、白条等产品已接入征信。 对于 Vue / Vite 中文文档国内的非官方部署Vue.js 创始人尤雨溪 22 日发文示意,有国内用户在没有跟 Vue 团队沟通过的前提下擅自把中文文档部署在其余域名下,并点名了两个网站:vitejs.cn 和 vue3js.cn。 他强调,尽管 Vue / Vite 的中文文档是 MIT 协定开源的,但文档自身具备版权,在没有官网翻译团队认可的状况下,擅自部署是十分不尊重翻译者劳动的行为,并呐喊部署了这些网站的用户们进行相似的行为。 库克谈整体员工大会泄密给媒体事件:将全力追究苹果 CEO 蒂姆·库克本周二在公司外部发送电子邮件,就上周整体员工大会的内容被泄露给媒体的状况进行了阐明。他示意,苹果正在“尽咱们所能查明泄密者的身份”,并指出“泄密的人不属于苹果公司”。 9 月 17 日,库克在整体员工大会上发表,苹果将要求对未接种疫苗的员工进行高频核酸检测,但苹果还不会强制要求接种疫苗。他还示意,在 Epic 起诉苹果垄断一案完结后,他“期待公司继续前进”。在大会完结不久后,这两条音讯都被泄露给美国科技媒体 The Verge。库克将这起事件类比为产品信息泄露,而以往苹果都会不遗余力地追究此类事件。 ...

September 25, 2021 · 2 min · jiezi

关于vue.js:自适配日历组件开发

自适配日历组件开发效果图PC端 挪动端 预览预览地址:预览地址 1、传入参数1.1、顶部背景图片 如上图红圈区域的照片背景设置 在组件参数中定义 bgSrc: { type: String, default: 'https://images8.alphacoders.com/992/992329.jpg'}1.2、日历题目如上图圈住区域文字设置 在组件参数中定义 title: { type: String, default: '日历'}2、回调办法2.1、选中日期应用this.&dollar;emit()向父组件传递数据。 在组件日期点击事件中执行。 clickDay (day) { this.selectDay = day this.$emit('selectDay', day)}2.2、切换月份应用this.&dollar;emit()向父组件传递数据。 在组件日期点击事件中执行。 //上个月toPreMonth () { let year = this.selectMonth.split('-')[0] let month = this.selectMonth.split('-')[1] month = parseInt(month) - 1 if (month === 0) { month = 12 year = parseInt(year) - 1 } this.days = this.fillDays(year, month) this.$emit('changeMonth', year + '-' + this.zero(month))},//下个月toNextMonth () { let year = this.selectMonth.split('-')[0] let month = this.selectMonth.split('-')[1] month = parseInt(month) + 1 if (month === 13) { month = 1 year = parseInt(year) + 1 } this.days = this.fillDays(year, month) this.$emit('changeMonth', year + '-' + this.zero(month))}3、组件js模块开发流程3.1、月份天数确认3.1.1、判断润年/** * 判断润年 * @param {string} year 须要判断的年份 * @return {Boolean} */function isLeap(year) { if((year%4==0 && year%100!=0)||(year%400==0)){ return true; } return false;}3.1.2、获取月份天数/** * 获取月份天数 * @param {string} year 年份 * @param {string} month 月份 * @return {string} */function getMonthDays(year,month) { month = parseInt(month) - 1; if(month < 0 || month > 11) return '' let months = [31,28,31,30,31,30,31,31,30,31,30,31]; if(isLeap(year)){ months[1] = 29; } return months[month];}3.1.3、获取星期/** * 获取星期 * @param {string} date 须要获取星期的日期 * @return {string} */function getWeek(date){ let weeks = new Array("日","一","二","三","四","五","六"); let Stamp = new Date(date); console.log(weeks[Stamp.getDay()])}3.1.4、补充满天数/** * 补零 * @param {string} str 须要补零的数 * @return {string} */function zero(str){ return str > 9 ? str : '0' + str;}/** * 补充满天数 * @param {string} year 年份 * @param {string} month 月份 * @return {string} */function fillDays(year,month) { const months = getMonthDays(year,month); const startWeek = getWeek(year + '-' + month + '-' + '01'); const endWeek = getWeek(year + '-' + month + '-' + months); year = parseInt(year); month = parseInt(month); let preYear = year; let preMonth = month - 1; if(preMonth == 0){ preMonth = 12; preYear = year - 1; } const preMonths = getMonthDays(preYear,preMonth); let nextYear = year; let nextMonth = month + 1; if(nextMonth == 13){ nextMonth = 1; nextYear = year + 1; } const nextMonths = getMonthDays(nextYear,nextMonth); let days = []; for(let i = 0; i < startWeek; i++){ days.unshift(preYear + '-' + preMonth + '-' + (preMonths - i)); } for(let i = 1; i <= months; i++){ days.push(year + '-' + zero(month) + '-' + zero(i)); } for(let i = 0; i < (6 - endWeek); i++){ days.push(nextYear + '-' + nextMonth + '-0' + (i + 1)); } return days;}3.2、点击事件3.2.1、月份切换toPreMonth () { let year = this.selectMonth.split('-')[0] let month = this.selectMonth.split('-')[1] month = parseInt(month) - 1 if (month === 0) { month = 12 year = parseInt(year) - 1 } this.days = this.fillDays(year, month) this.$emit('changeMonth', year + '-' + this.zero(month))},toNextMonth () { let year = this.selectMonth.split('-')[0] let month = this.selectMonth.split('-')[1] month = parseInt(month) + 1 if (month === 13) { month = 1 year = parseInt(year) + 1 } this.days = this.fillDays(year, month) this.$emit('changeMonth', year + '-' + this.zero(month))}3.2.2、日期点击clickDay (day) { this.selectDay = day this.$emit('selectDay', day)}4、html模块<template> <div> <div id="header" class="header"> <div class="header-title">{{title}}</div> <div class="btn-list"> <div class="btn-list-left"> <div class="btn-pre" @click="toPreMonth()"><</div> <div class="select-month">{{selectMonth}}</div> <div class="btn-next" @click="toNextMonth()">></div> </div> <div class="btn-today" @click="toNowDay()">回到明天</div> </div> </div> <div class="content" id="content"> <div class="calendar-content"> <div class="grid-week grid" v-for="(item,index) in weeks" :key="index"> 周{{item}} </div> <div @click="clickDay(item)" class="grid-day grid" :class="{'selected': item == selectDay}" v-for="(item,index) in days" :key="index"> {{item.split('-')[2]}} </div> </div> </div> </div></template>5、CSS款式<style lang="scss" scoped> @media screen and (max-width:500px) { .header{ height: calc(100vw * 9 / 16); } } .header{ display: flex; flex-direction: column; .header-title{ line-height: 5rem; } .btn-list{ display: flex; padding: 1rem; margin-top: auto; .btn-list-left{ padding: 0.5rem; width: 40%; display: flex; .select-month{ flex: 2; } .btn-pre{ flex: 1; background-color: #0080FF; } .btn-next{ flex: 1; background-color: #0080FF; } } .btn-today{ padding: 0.5rem; margin-left: auto; margin-right: 1rem; background-color: #076678; color: white; } } } .calendar-content{ display: flex; flex-wrap: wrap; width: 100%; .selected{ background-color: #007FAA; } .grid{ width: calc((100% - 9px)/7); height: 3rem; line-height: 3rem; border-left: #005599 solid 1px; border-bottom: #005599 solid 1px; } .grid-week{ border-top: #005599 solid 1px; } .grid-week:nth-child(7){ border-right: #005599 solid 1px; } .grid-day:nth-child(14){ border-right: #005599 solid 1px; } .grid-day:nth-child(21){ border-right: #005599 solid 1px; } .grid-day:nth-child(28){ border-right: #005599 solid 1px; } .grid-day:nth-child(35){ border-right: #005599 solid 1px; } .grid-day:nth-child(42){ border-right: #005599 solid 1px; } }</style>源码地址Gitee:https://gitee.com/zheng_yongtao/jyeontu-component-warehouse/tree/master/components ...

September 25, 2021 · 4 min · jiezi

关于vue.js:基于element-ui实现一个按周选择时间范围的功能

背景公司有个用vue + element ui 开发的我的项目须要实现这样一个需要:以周为周期抉择一个工夫范畴,并显示为日期的格局,能够快捷抉择近1周,近周围…… antd中是有周范畴选择器的,悲催的是element ui没有,并且也没找到相似的,只好本人封一个 下图为antd 下图为element ui,只有日期范畴和月范畴,偏偏没有周范畴…… 思路有两种思路 管制两个独自的周选择器实现联动革新日期选择器,选中某个日期时对应的整行变色这里最终选用了第一种思路,用到了moment库,应用装置很简略,可自行装置 实现成果: template局部,这里的value1,value2的值为咱们所选周的星期一,为格林尼治工夫的格局; date1, date2为周选择器的value对应的日期,date1取当周的星期一(起始日期),date2取当周的星期日(完结日期),weekNum为周数 实现代码template构造: <div class="block"> <span style="margin-right:10px">周期抉择: </span> <el-date-picker v-model="value1" type="week" format="yyyy 第 WW 周" placeholder="抉择周" :picker-options="pickerOptions" style="width: 180px" > </el-date-picker> 至 <el-date-picker v-model="value2" type="week" format="yyyy 第 WW 周" placeholder="抉择周" :picker-options="pickerOptions" style="width: 180px" > </el-date-picker> <span v-if="value1&&value2" style="margin-left: 10px"> {{ date1 }} 至 {{ date2 }}, 共 {{ weekNum }} 周 </span> </div>weekNum的计算: computed: { weekNum() { return Math.round((this.value2 - this.value1) / (24 * 60 * 60 * 1000 * 7)) + 1 }, },data: data() { return { value1: null, value2: null, date1: '', date2: '', pickerOptions: { firstDayOfWeek: 1, disabledDate: (time) => this.getDisabledDate(time, 'start'), shortcuts: [{ text: '近1周', onClick: (picker) => { this.onWeekChange(picker, 1) } }, { text: '近4周', onClick: (picker) => { this.onWeekChange(picker, 4) } }, { text: '近12周', onClick: (picker) => { this.onWeekChange(picker, 12) } }] } } },created外面来设置一个起始日期,这里将value设为了最近一周的周一, created() { this.value1 = this.value2 = moment().isoWeekday(-5).toDate() },侦听value1, value2,当它们变动时更新日期watch: { value1() { if (!this.value1) return if (this.value1 >= this.value2) { // 保障value2大于value1 this.value2 = this.value1 } this.date1 = moment(this.value1.getTime() - 24 * 60 * 60 * 1000).format('YYYY-MM-DD') this.onValueChange() // 这里为咱们心愿value扭转时触发的办法 }, value2() { if (!this.value2) return this.date2 = moment(this.value2.getTime() + 5 * 24 * 60 * 60 * 1000).format('YYYY-MM-DD') this.onValueChange() },}选中近k周的后触发的操作methods: { onWeekChange(picker, k) { // 选中近k周后触发的操作 this.value1 = moment().isoWeekday(-(5 + (k - 1) * 7)).toDate() this.value2 = moment().isoWeekday(-5).toDate() //value2与k值无关,因为它总是为最近一周的周一 this.$forceUpdate() // 这里如果不强制更新视图,会呈现value值扭转而视图中的第几周和日期无变动的状况 },}

September 24, 2021 · 2 min · jiezi

关于vue.js:vue3全局挂载和使用

1.开发环境 vue3.02.电脑系统 windows10专业版3.在应用vue开发的过程中,咱们会有一些专用的属性和办法,咱们个别为了方便使用会这个属性和办法挂载到全局,上面我来分享一下4.vue2挂载办法 Vue.prototype.$http = http//在对应的组件中应用this.$http//这种写法置信小火们很相熟了,那么在vue3中怎么写呢?4-1.vue3挂载并应用 // 全局挂载const app = createApp(App)app.config.globalProperties.$Methods = Methods;//在对应的组件中应用import { defineComponent, ref, getCurrentInstance, onMounted, reactive,} from "vue";//因为vue3是组合API,所以要引入对应的(getCurrentInstance)// setup//一个json数组去重const { proxy }: any = getCurrentInstance();//要害代码 const $Methods = proxy.$Methods;//要害代码 const jsonarrreduce = reactive([ { id: "1", name: "李白" }, { id: "2", name: "杜甫" }, { id: "3", name: "白居易" }, { id: "4", name: "项羽" }, { id: "5", name: "小米" }, { id: "1", name: "红米" }, { id: "1", name: "诺基亚" }, { id: "2", name: "真我" }, ]); onMounted(() => { console.log($Methods.JsonArrReduce(jsonarrreduce, "id")); });5.本期的分享到了这里就完结啦,心愿对你有所帮忙,让咱们一起致力走向巅峰。 ...

September 24, 2021 · 1 min · jiezi

关于vue.js:ie兼容vue项目

yarn add babel-polyfill src/main.js 首行减少:import 'babel-polyfill'

September 24, 2021 · 1 min · jiezi

关于vue.js:vuex命名空间

mapState、mapGetters、mapMutations、mapActions第一个参数是字符串(命名空间名称),第二个参数是数组(不须要重命名)/对象(须要重命名)。 mapXXXs('命名空间名称',['属性名1','属性名2'])mapXXXs('命名空间名称',{ '组件中的新名称1':'Vuex中的原名称1', '组件中的新名称2':'Vuex中的原名称2',})我的项目构造 mian.jsimport Vue from "vue";import App from "./App.vue";import router from "./router";import store from "./store/index";Vue.config.productionTip = false;new Vue({ router, store, render: h => h(App)}).$mount("#app");index.jsimport Vue from "vue";import Vuex from "vuex";import cat from "./modules/cat";import dog from "./modules/dog";Vue.use(Vuex);export default new Vuex.Store({ modules: { cat, dog }});cat.jsexport default { namespaced: true, // 部分状态 state: { name: "蓝白英短", age: 1 }, // 部分读取 getters: { desc: state => "宠物:" + state.name }, // 部分变动 mutations: { increment(state, payload) { state.age += payload.num; } }, // 部分动作 actions: { grow(context, payload) { setTimeout(() => { context.commit("increment", payload); }, 1000); } }};dog.jsexport default { namespaced: true, // 部分状态 state: { name: "拉布拉多", age: 1 }, // 部分读取 getters: { desc: state => "宠物:" + state.name }, // 部分变动 mutations: { increment(state, payload) { state.age += payload.num; } }, // 部分动作 actions: { grow(context, payload) { setTimeout(() => { context.commit("increment", payload); }, 1000); } }};hello.vue<template> <div class="hello"> <h3>Vuex状态树</h3> <div>{{this.$store.state}}</div> <h3>mapState</h3> <div>{{catName}} {{catAge}}</div> <div>{{dogName}} {{dogAge}}</div> <h3>mapGetters</h3> <div>{{catDesc}}</div> <div>{{dogDesc}}</div> <h3>mapMutations</h3> <button @click="catIncrement({num:1})">猫变动</button> <button @click="dogIncrement({num:1})">狗变动</button> <h3>mapActions</h3> <button @click="catGrow({num:1})">猫动作</button> <button @click="dogGrow({num:1})">狗动作</button> </div></template><script>import { mapState, mapGetters, mapMutations, mapActions } from "vuex";export default { name: "HelloWorld", computed: { ...mapState("cat", { catName: "name", catAge: "age" }), ...mapState("dog", { dogName: "name", dogAge: "age" }), ...mapGetters("cat", { catDesc: "desc" }), ...mapGetters("dog", { dogDesc: "desc" }) }, methods: { ...mapMutations("cat", { catIncrement: "increment" }), ...mapMutations("dog", { dogIncrement: "increment" }), ...mapActions("cat", { catGrow: "grow" }), ...mapActions("dog", { dogGrow: "grow" }) }};</script><!-- Add "scoped" attribute to limit CSS to this component only --><style scoped lang="scss"></style>运行成果 ...

September 23, 2021 · 2 min · jiezi

关于vue.js:带你掌握Vue过滤器filters及时间戳转换

摘要:Vue的filters过滤器是比拟常见的一个知识点,上面我将联合工夫戳转换的例子带你疾速理解filters的用法。本文分享自华为云社区《三分钟把握Vue过滤器filters及工夫戳转换》,作者:北极光之夜。。 一.速识概念:大家好呀,Vue的filters过滤器是比拟常见的一个知识点,上面我将联合工夫戳转换的例子带你疾速理解filters的用法~ 依照官网的活来说,Vue.js 容许你自定义过滤器,可被用于一些常见的文本格式化。过滤器能够用在两个中央:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始反对)。过滤器应该被增加在 JavaScript 表达式的尾部,由“管道”符号批示。 简略来说就是在filters过滤器里定义一个处理函数,把函数名称写在管道符 “|” 前面,它就会解决管道符 “|” 前自定义的数据,其中自定义的数据会主动成为过滤器函数的参数。 <!-- 在双花括号中 -->{{ message | capitalize }}<!-- 在 `v-bind` 中 --><div v-bind:id="rawId | formatId"></div>过滤器次要能够分为部分过滤器和全局过滤器,上面看具体介绍。 二.部分过滤器:部分过滤器就是在一个组件的选项中定义本地的过滤器,只有该组件能够用。在咱们个别开发中,对于工夫后端个别只会返回一个工夫戳让前端本人解决,上面比方定义一个转换工夫戳为日期格局的过滤器(留神步骤):<template> <div> <!-- 4. 渲染数据,设置过滤器 --> {{ times | conversion }} </div></template><script>export default { data() { return { // 1.模仿一个工夫戳数据 times: 1616959086000, }; }, // 2. 定义过滤器 filters: { //3.定义一个处理函数,参数value为要解决数据 conversion: function (value) { //调用Date的办法,解决工夫戳 return new Date(value).toLocaleString(); }, },};</script>后果,转换胜利: ...

September 23, 2021 · 2 min · jiezi

关于vue.js:实现ElementUI中table组件懒加载效果

一、增加相干属性二、增加haschildren字段 1、通过map办法遍历数据,给须要懒加载的项增加hasChildren字段,Object.assign(item, { hasChildren: true }),2、在load(tree, treeNode, resolve) {},发送须要懒加载的数据,其中tree能够拿到以后项的数据

September 22, 2021 · 1 min · jiezi

关于vue.js:ElementUI中table组件中showsummary不生效问题

一、 后端给我的数据是上面这种格局:"data": [ { "code": "\"xiaoxue\"", "name": "\"小学\"", "question": { "entryCount": 1000, "processCount": 1000, "reviewCount": 1000, "publishCount": 1000 },...]发现在table组件里进行遍历data的时候,当数据写成props:'question.entryCount'的时候,在el-table里增加show-summary属性后,在最初一行无奈进行共计,巴嘎!尝试应用summary-method自定义共计办法也无用,最初想解决下数据二、 //扁平化对象将数组中question.entryCount提出来改为questionentryCount增加到外层就能够失常共计了flattenObj(obj) { const result = {} const process = (key, value) => { // 首先判断是根底数据类型还是援用数据类型 if (Object(value) !== value) { // 根底数据类型 if (key) { result[key] = value } } else if (Array.isArray(value)) { for (let i = 0; i < value.length; i++) { process(`${key}[${i}]`, value[i]) } if (value.length === 0) { result[key] = [] } } else { //逻辑在此 const objArr = Object.keys(value) objArr.forEach(item => { // process(key ? `${key}.${item}` : `${item}`, value[item]) process(key ? `${key}${item}` : `${item}`, value[item]) }) if (objArr.length === 0 && key) { result[key] = {} } } } process('', obj) return result}

September 22, 2021 · 1 min · jiezi

关于vue.js:分片渲染Vue虚拟列表

问题以前在面试中遇到过一个这样的问题:如果给你数据量很大比方十万条,后盾又没有分页的性能,那么你怎么操作能加重浏览器的压力或者说怎么能更晦涩的渲染进去。 很显著这个问题属于那种没事找事型的,那么既然问进去了,咱们还是得探一探到底。 1.分片渲染分片渲染顾名思义就是数据离开渲染,这样解决了一次性渲染所带来的卡顿。 实现原理依据EventLoop原理实现的,代码执行放入执行栈中,同步代码先执行,遇到宏工作放入宏工作队列,遇到微工作放到微工作队列,等同步代码执行结束之后清空微工作队列,而后再将宏工作队列的第一项放入执行栈中,再进行以上的执行过程,这就造成了事件环机制(每循环一次会执行一个宏工作,并清空对应的微工作队列) 代码实现<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>分片渲染</title> </head> <style> #app { width: 100px; height: 300px; overflow: auto; } </style> <body> <div id="app"></div> </body></html><script> let index = 0; let total = 100; let id = 0; function load() { index += 10; if (index <= total) { //定时器属于宏工作,它的执行程序是等上一个宏工作也就是上一个定时器执行实现之后能力执行 setTimeout(() => { for (let i = 0; i < 10; i++) { let item = document.createElement("div"); item.innerHTML = id++; app.appendChild(item); } //应用递归的形式 load(); }, 1000); } } load();</script>下面也说到了分片渲染比一次性渲染的性能更好,然而dom元素还是那么多,本质上并不是最优的解决办法,那么咱们来看一看虚构列表。 ...

September 22, 2021 · 2 min · jiezi

关于vue.js:Vue组件中使用插槽

什么是插槽插槽就是子组件中的提供给父组件应用的一个占位符,用<slot></slot> 示意,父组件能够在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签。 根本应用编写一个父组件 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Demo</title> <script src="https://unpkg.com/vue@next"></script></head><body> <div id="app"></div></body><script> const app = Vue.createApp({ template: ` <h2>父组件</h2>` }) const vm = app.mount("#app")</script></html>再写一个子组件 app.component('son', { template: ` <div> <h3>子组件</h3> </div> `})父组件调用子组件 const app = Vue.createApp({ template: ` <h2>父组件</h2><son />` })插槽如何应用呢?只须要在子组件中退出<slot></slot>,而后在父组件中应用。 app.component('son', { template: ` <div> <h3>子组件</h3> <slot></slot> </div> `})const app = Vue.createApp({ template: ` <h2>父组件</h2><son>这是父组件要在子组件中显示的内容</son>` })运行成果: 父组件子组件这是父组件要在子组件中显示的内容插槽反对任何DOM元素,比方咱们增加style款式 const app = Vue.createApp({template: ` <h2>父组件</h2><son><div style="color:red;font-size:25px">这是父组件要在子组件中显示的内容</div></son>` })默认插槽咱们如果须要子组件在任何状况下,都能渲染文本。咱们能够将默认文本放在<slot>标签内: app.component('son', { template: ` <div> <h3>子组件</h3> <slot>子组件的默认内容</slot> </div> `})当初应用父组件去调用: ...

September 22, 2021 · 1 min · jiezi

关于vue.js:vueVue实例的生命周期

Vue实例的生命周期官网生命周期图示 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforDestroydestroyed其余lifecycle_hook keep-alive配合应用的activated和deactivated捕捉谬误的errorCaptured解决ssr的serverPrefetch各阶段生命周期函数阐明 1 beforeCreate created这两个hook是在模板编译之前,初始化阶段执行源码 在调用beforeCreate之前 初始化生命周期初始化事件初始化render在调用created之前 初始化注入初始化状态初始化provideinitState function initState (vm) { vm._watchers = []; var opts = vm.$options; if (opts.props) { initProps(vm, opts.props); } if (opts.methods) { initMethods(vm, opts.methods); } if (opts.data) { initData(vm); } else { observe(vm._data = {}, true /* asRootData */); } if (opts.computed) { initComputed(vm, opts.computed); } if (opts.watch && opts.watch !== nativeWatch) { initWatch(vm, opts.watch); } }初始化状态 initPropsinitMethodsinitDatainitComputedinitWatchinitState的调用在beforeCreate与created之间,所以beforeCreate获取不到vm上的data与methodscreated能获取到2 beforeMount mountedbeforeMount在模板编译后,挂载前,mounted在挂载之后 调用beforeMount之前 ...

September 22, 2021 · 1 min · jiezi

关于vue.js:vue商城项目问题记录

Supermall我的项目笔记1.axios封装能够在network中再创立独立的js文件,封装不同页面的网络申请,防止页面组件过大过于简单 2.轮播图钩子挂载实现时,操作DOM树,开启定时器 mounted: function () { // 1.操作DOM, 在前后增加Slide setTimeout(() => { this.handleDom(); // 2.开启定时器 this.startTimer(); }, 3000) },这里hanleDom()函数获取了元素数量,并克隆第一张和最初一张图片并插入到最初和最前,实现无缝滚动。 轮播图问题图片加载慢时,会导致图片还没加载实现就执行了mounted中的函数操作DOM并开启了定时器 解决办法: ①原生的mutationObserver监听DOM树变动 //methods中办法swiperObserver() { const targetNode = document.querySelector('.swiper'); const config = {childList: true}; const callback = (mutationsList, observer) => { this.handleDom(); this.startTimer(); observer.disconnect(); }; const observer = new MutationObserver(callback); observer.observe(targetNode, config);}//mounted中调用//为了避免热更新时dom不从新加载而导致监听生效,所以加一个判断mounted() { if(document.querySelector(".swiper").childElementCount == 0) { this.observeSwiper(); } else { this.handleDom() this.startTimer() }}②监听<img>的onload事件,加载实现后给swiper组件传入一个属性,通过watch监听该属性 <img :src="item.img" @load="imageLoad" alt="轮播图片" />imageLoad() { if(!this.isLoad) { this.$emit('swiperImageLoad'); this.isLoad = true; }}<home-swiper @swiperImageLoad></home-swiper>swiperImageLoad() { this.handleDom() this.startTimer()}3.商品数据的保留构造申请三种数据,依据点击取出不同的数据。思考到加载工夫,不应该一次性申请全副数据 ...

September 22, 2021 · 3 min · jiezi

关于vue.js:vueMVVM双向绑定

MV*模式MVCMVPMVVM1 MVC一个利用分为三局部 模型 (Model):数据保留 应用程序的数据、管制与批改这些数据的业务规定Model扭转时:告诉View,为View提供查问Model相干状态的能力,为Controller提供拜访封装在Model外部的应用程序性能的能力。视图 (View):用户界面 组织Model的内容Model扭转时:View负责保护数据体现的一致性,同时View将用户的申请告诉Controller控制器 (Controller):业务逻辑 应用程序的行为解释来自View的用户申请,把申请映射为行为,再由Model实现这些行为。结构图: View传送指令到ControllerController实现业务逻辑后,要求Model扭转状态Model将新的数据发送到View,用户失去反馈 承受指令的形式由View承受指令,传递给ControllerController间接承受指令2 MVP模型(Model):提供数据视图(View):用户界面示意器(Presenter):逻辑的解决结构图 View与Model无分割,都通过Presenter传递View中不部署任何业务逻辑 - 被动视图所有逻辑都部署在Presenter与MVC的区别View不能间接从Model中读取数据3 MVVM基本上与MVP模式统一 模型(Model):保留数据视图(View):用户界面数据驱动(View-Model):业务逻辑 VM负责转换Model中的数据对象结构图 操作View时,ViewModel感知变动,告诉Model产生相应的变动,若Model扭转时,ViewModel感知变动,告诉View进行更新ViewModel与View双向数据绑定,Model通过接口申请数据交互,承前启后。双向数据绑定Vue2:Object.defineProperty()Vue3:Proxy代理1 Vue2双向绑定实现Object.defineProperty(obj,prop,description) 原理简析,不做依赖收集/** * 对Object.defineProperty()进行封装 */function defineReactive(obj, key, value) { //递归 - 对象的属性仍是对象 observe(value); //变动侦测 Object.defineProperty(obj, key, { get() { return value; }, set(newVal) { if (newVal !== value) { updateView(); value = newVal; observe(newVal) } } })}/** * 对一个对象所有属性的变动侦测 */function observe(target) { //非对象,间接返回 if (typeof target !== 'object') { return target; } //将每个属性转换为getter和setter模式 for (let key in target) { defineReactive(target, key, target[key]) }}//模仿更新视图的办法function updateView() { console.log("更新视图");}通过间接调用observe侦测对象属性的变动存在的问题 ...

September 20, 2021 · 2 min · jiezi

关于vue.js:Vueuse包提供的useIntersectionObserver-方法如何使用参数返回值

const {stop} = useIntersectionObserver(target, fn, options)1、参数一target示意被监听的DOM元素 2、参数二是回调函数,用于告诉监听的动作(回调函数的第一个形参isIntersecting示意被监听的元素曾经进入了可视区) 3、参数三 示意配置选项 stop 是进行察看是否进入或移出可视区域的行为 const { stop } = useIntersectionObserver(target 是察看的指标dom容器,必须是dom容器,而且是vue3.0形式绑定的dom对象 target, // isIntersecting 是否进入可视区域,true是进入 false是移出 // observerElement 被察看的dom ([{ isIntersecting }], observerElement) => { // 在此处可依据isIntersecting来判断,而后做业务 },)业务性能场景基于该办法实现组件的懒加载 第一步:在SRC下封装一个钩子函数,src/hooks/index.js文件夹下;代码如下: // 封装一个通用的办法实现数据的懒加载import { useIntersectionObserver } from '@vueuse/core'import { ref } from 'vue'export const useLazyData = (apiFn) => { // target示意组件的最外层div元素 const target = ref(null) // 懒加载接口返回的数据 const result = ref([]) // 监听组件是否进入可视区 const { stop } = useIntersectionObserver(target, ([{ isIntersecting }]) => { // 如果target对应的DOM进入可视区,那么该回调函数就触发 if (isIntersecting) { // 被监听的DOM进入了可视区:此时调用接口获取数据;进行持续监听 stop() apiFn().then(data => { result.value = data.result }) } }) // result示意接口懒加载获取的业务数据 // target示意被监听的DOM元素,须要在模板中被ref属性绑定 return { result, target }}第二步:在所须要的文件夹中导入例如: ...

September 20, 2021 · 1 min · jiezi

关于vue.js:足球直播比分网定制开发搭建比赛数据源码一

足球直播比分网定制开发搭建较量数据源码(一) GET/soccer/api/result 阐明想要疾速搭建足球直播较量比分站,通过破晓字节足球数据API接口较量数据后果接口次要用来拉取足球比赛赛果数据。每一场较量完结时更新赛果数据,破晓字节足球数据API接口会通过websocket推送赛果数据变动,以下是赛果数据的全量字段构造,推送类型参照【推送类型】,资源操作类型action_type,推送构造与拉取数据结构统一当websocket中断时,也能够通过【足球变动信息接口】获取中断时脱漏的赛果数据更新信息 JAVA申请示例 OkHttpClient client = new OkHttpClient().newBuilder() .build();Request request = new Request.Builder() .url("https://sports.dawnbyte.com/soccer/api/result?time_stamp=1595238756&match_id=93530") .method("GET", null) .addHeader("token", "请分割jack_dawnbyte") .build();Response response = client.newCall(request).execute();出现形式如下:足球数据API和直播接口提供足球比赛实时直播流和队伍数据、队员数据,字段蕴含:比分角球红黄牌射门射正点球等队员阵容:首发进球助攻点球等点击队员可进入队员详情数据

September 18, 2021 · 1 min · jiezi

关于vue.js:vue-封装-密码框

<template> <div class="password-number" :class="{ gutter: gutter != 0 }"> <div class="password-item" :class="{ gutter: gutter != 0 }" :style="{ margin: `0 ${gutter}px` }" v-for="(item, index) in length" :key="index" > <input class="password-input" @input="_input" @keyup="_keyup" :type="!password ? 'number' : 'text'" :ref="`passwordIndex${index}`" :value="!password ? code[index] : passwordViewCode[index]" :maxlength="1" v-max-length="{ password, mark }" /> </div> <div class="mantle" @click="setFocus"></div> </div></template><script>export default { data() { return { code: "", passwordViewCode: "", }; }, props: { //明码数量 length: { type: Number, default: 6, }, //是否展现明文 password: { type: Boolean, default() { return false; }, }, //加密字符 mark: { type: String, default() { return "●"; }, }, //格子间距 gutter: { type: String, default() { return "0"; }, }, }, directives: { /** * 自定义指令 最大数量 */ maxLength: { bind(el, { value }) { el.oninput = () => { let str = el.value; if (el.value.length > 1) { if (str.length > 1) { el.value = value.password ? value.mark : str.charAt(0); } else { el.value = str.charAt(0); } } }; }, }, }, methods: { /** * 焦点赋值 */ setFocus() { let _length = this.code.length; if (_length < this.length) { this.$refs[`passwordIndex${_length}`][0].focus(); } else { this.$refs[`passwordIndex${_length - 1}`][0].focus(); } }, /** * 输出 */ _input(e) { if (e != null) { let str = e.data; if (/[^\d]/g.test(str)) { str = ""; this.$refs[`passwordIndex0`][0].value = str; } if (/^[0-9]+$/.test(str)) { if (this.code.length < this.length) { this.code += str; this.passwordViewCode += this.mark; this.setFocus(); } if (this.code.length == this.length) { this.$emit("change", this.code); } } } }, /** * 删除 */ _keyup(e) { if (e.keyCode == 8) { let str = this.code; this.code = str.substr(0, str.length - 1); let password_str = this.passwordViewCode; this.passwordViewCode = password_str.substr(0, password_str.length - 1); this.setFocus(); } }, /** * 重置数据 */ resetData() { this.code = ""; this.passwordViewCode = ""; }, },};</script><style lang="scss" scoped>.password-number { height: 40px; width: 400px; border: 1px solid #ddd; display: flex; position: relative; &.gutter { border: 0; } .mantle { position: absolute; top: 0; left: 0; width: 100%; height: 100%; cursor: pointer; } .password-item { flex: 1; position: relative; &::after { content: ""; display: block; width: 1px; height: 30px; background-color: #eee; position: absolute; top: 50%; transform: translateY(-50%); left: 0; } &:nth-child(1) { &::after { display: none; } } &.gutter { background-color: #eee; width: 40px; &::after { display: none; } } .password-input { width: 100%; height: 100%; text-align: center; display: flex; align-items: center; justify-content: center; background: none; border: 0; } }}</style>

September 18, 2021 · 2 min · jiezi

关于vue.js:vue创建项目使用yarn包管理工具

1.开发环境 vue2.电脑系统 windows10专业版3.在应用vue开发的过程中,咱们在创立我的项目的过程中,咱们之前抉择的都是npm包,然而咱们之后创立我的项目想要应用yarn包管理工具,怎么做呢?4.装置yarn npm install -g yarn5.在C盘找到 //删除选中的文件删除之后,再次执行 vue create xxx,会提醒你抉择对应的包管理工具5-1.对于.vuerc6.本期的分享到了这里就完结啦,心愿对你有所帮忙,让咱们一起致力走向巅峰。

September 18, 2021 · 1 min · jiezi

关于vue.js:符号与弱引用的实际应用的设计

因为在main.c 和strong.c 文件中,整型变量strong是全局变量,它们的作用域都是跨文件的。若是在不同的作用域,即便雷同变量名,也不会报错。星池科技 编译器会有默认的优先级解决:总是更小作用域的变量笼罩更大作用域的变量,前提是这两个变量的作用域是蕴含或被蕴含的关系。比方:在链接过程中,须要找到对应的符号定义,若未找到对应符号(未定义),链接器会报符号位未定义谬误,导致编译出错。这种被称为强援用。与绝对应的时弱援用(开发者可通过 往往也会为了配合sdk,进行简略的批改。以设施降级作为举例,若降级过程中,分为传包(pass),验签(verify),解密(decode),装置(install),https://www.starpool.cn 上传日志(report)等步骤,并且这些外围接口都是以libsdk.so库的模式提供给利用工程师。那么失常状况下,应用逻辑大抵如下。

September 18, 2021 · 1 min · jiezi

关于vue.js:httpscloudstarpoolcnindexhtml

https://cloud.starpool.cn/ind...

September 17, 2021 · 1 min · jiezi

关于vue.js:在Vue30项目中如何手动封装轮播图组件

因为我的项目的非凡状况,所以须要手动封装一个轮播图,大抵步骤: 筹备一个Hz-carousel组件根底布局并全局注册筹备home-banner组件,应用Hz-carousel组件,再首页注册应用。深度作用选择器笼罩Hz-carousel组件的默认款式上面是具体步骤: 第一步: 当初SRC下的components文件夹中创立一个专门为我的项目封装组件的文件夹,以便好治理. 例如:library/Hz-carousel.vue轮播图根底构造代码 <template> <div class='Hz-carousel'> <ul class="carousel-body"> <li class="carousel-item fade"> <RouterLink to="/"> <img src="http://yjy-xxxxxx-dev.oss-cn-beijing.aliyuncs.com/picture/2021-04-15/1ba86bcc-ae71-42a3-bc3e-37b662f7f07e.jpg" alt=""> </RouterLink> </li> </ul> <a href="javascript:;" class="carousel-btn prev"><i class="iconfont icon-angle-left"></i></a> <a href="javascript:;" class="carousel-btn next"><i class="iconfont icon-angle-right"></i></a> <div class="carousel-indicator"> <span v-for="i in 5" :key="i"></span> </div> </div></template><script>export default { name: 'HzCarousel'}</script><style scoped lang="less">.Hz-carousel{ width: 100%; height: 100%; min-width: 300px; min-height: 150px; position: relative; .carousel{ &-body { width: 100%; height: 100%; } &-item { width: 100%; height: 100%; position: absolute; left: 0; top: 0; opacity: 0; transition: opacity 0.5s linear; &.fade { opacity: 1; z-index: 1; } img { width: 100%; height: 100%; } } &-indicator { position: absolute; left: 0; bottom: 20px; z-index: 2; width: 100%; text-align: center; span { display: inline-block; width: 12px; height: 12px; background: rgba(0,0,0,0.2); border-radius: 50%; cursor: pointer; ~ span { margin-left: 12px; } &.active { background: #fff; } } } &-btn { width: 44px; height: 44px; background: rgba(0,0,0,.2); color: #fff; border-radius: 50%; position: absolute; top: 228px; z-index: 2; text-align: center; line-height: 44px; opacity: 0; transition: all 0.5s; &.prev{ left: 20px; } &.next{ right: 20px; } } } &:hover { .carousel-btn { opacity: 1; } }}</style>**全局注册轮播图 src/components/library/index.js** ...

September 17, 2021 · 2 min · jiezi

关于vue.js:vue插槽slot

插槽默认插槽具名插槽作用域插槽1默认插槽数据与构造在父组件插槽在子组件子组件 <!-- 复用的构造-->...<!-- 不复用的地位 --><slot>无插入时默认构造</slot><!-- 复用的构造-->...父组件 <Component > <img/></Component> <video/><Component > <h3/><Component >复用组件 每个被复用的组件有一部分构造或数据不同从父组件中将不同的数据与构造填充到子组件的插槽中2具名插槽数据与构造在父组件中插槽在子组件中复用的组件有多个中央不同子组件 <!-- 复用的构造 -->...<!-- 不复用的地位1 --><slot name="slot1">默认值1<slot><!-- 复用的构造 -->...<!-- 不复用的地位2 --><slot name="slot2">默认值2<slot>父组件 <Component > <template v-slot:slot1> <img/> </template> <template v-slot:slot2> <video/> </template></Component> <Component > <template v-slot:slot1> <h3></h3> </template> <template v-slot:slot2> <img/> </template></Component >给每个插槽增加name属性父组件插入的模板增加v-slot属性无指定的模板 默认插入无name属性的插槽3 作用域插槽构造在父组件数据与插槽在子组件默认子组件 <!-- 复用的构造-->...<!-- 不复用的地位 --><slot :data1="food" :data2="drink">无插入时默认构造</slot><!-- 复用的构造-->...父组件 <Component > <!-- 对象取值 --> <template v-slot="data"> <h2>{{data.data1}}</h2> </template></Component> <Component > <!-- 解构取值 --> <template v-slot="{ data2 }"> <h3>{{data2}}</h3> </template></Component >具名子组件 ...

September 16, 2021 · 1 min · jiezi

关于vue.js:vue3对比-vue2-有什么优点

摘要:Vue3新版本的理念成型于 2018 年末,过后的 Vue 2 曾经有两岁半了。比起通用软件的生命周期来这如同也没那么久,Vue3在2020年正式推出,在源码和API都有较大变动,性能失去了显著的晋升,比Vue2.x快1.2~2倍。本文分享自华为云社区《【云驻共创】vue3 相比 vue2 的十项长处》,作者: 海拥 。 Vue3新版本的理念成型于 2018 年末,过后的 Vue 2 曾经有两岁半了。比起通用软件的生命周期来这如同也没那么久,Vue3在2020年正式推出,在源码和API都有较大变动,性能失去了显著的晋升,比Vue2.x快1.2~2倍。 其中,一些比拟重要的长处有: diff算法的优化;hoistStatic 动态晋升;cacheHandlers 事件侦听器缓存;ssr渲染;更好的Ts反对;Compostion API: 组合API/注入API;更先进的组件;自定义渲染API;按需编译,体积比vue2.x更小;反对多根节点组件等。上面咱们就来具体说说vue3 的长处: 长处1:diff算法的优化vue2中的虚构dom是全量的比照(每个节点不管写死的还是动静的都会一层一层比拟,这就节约了大部分事件在比照动态节点上) vue3新增了动态标记(patchflag)与上次虚构节点比照时,只比照带有patch flag的节点(动态数据所在的节点);可通过flag信息得悉以后节点要比照的具体内容。 例如:上面的模板蕴含一个div,div内蕴含三个段落,其中前两个段落是动态固定不变的,而第三个段落的内容绑定的msg属性,当msg扭转的时候,Vue会生成新的虚构DOM而后和旧的进行比照。 <div> <p>云驻共创</p> <p>如何评估 vue3</p> <p>{{msg}}</p></div>当视图更新时,只对动静节点局部进行diff运算,缩小了资源的损耗。Patchflag是个枚举,取值为1代表这个元素的文本是动静绑定的,取值为2代表元素的class是动静绑定的。 长处2:hoistStatic 动态晋升vue2无论元素是否参加更新,每次都会从新创立而后再渲染。 vue3对于不参加更新的元素,会做动态晋升,只会被创立一次,在渲染时间接复用即可。例如:上面咱们利用Vue 3 Template Explorer,来直观的感受一下: <div> <div>共创1</div> <div>共创2</div> <div>{{name}}</div></div>动态晋升之前 export function render(...) { return ( _openBlock(), _createBlock('div', null, [ _createVNode('div', null, '共创1'), _createVNode('div', null, '共创2'), _createVNode( 'div', null, _toDisplayString(_ctx.name), 1 /* TEXT */ ), ]) )}动态晋升之后 ...

September 16, 2021 · 2 min · jiezi

关于vue.js:Eslint-Prettier为团队项目协作保驾护航

eslint 作为我的项目代码格调管理工具Prettier 能够认为是帮忙代码格式化的工具构建我的项目在vue-cli初始化我的项目时 抉择 eslint : 默认有3种格调 .eslintrc.js阐明会在我的项目根目录产生一个.eslintrc.js文件,外面能够进行代码检测的相干配置,例如规定rules的配置,相干配置示例如下: module.exports = { //此项是用来通知eslint找以后配置文件不能往父级查找 root: true, //此项是用来指定eslint解析器的,解析器必须合乎规定,babel-eslint解析器是对babel解析器的包装使其与ESLint解析 parser: 'babel-eslint', //此项是用来指定javaScript语言类型和格调,sourceType用来指定js导入的形式,默认是script,此处设置为module,指某块导入形式 parserOptions: { // 设置 script(默认) 或 module,如果代码是在ECMASCRIPT中的模块 sourceType: 'module', "ecmaVersion": 6, "ecmaFeatures": { "jsx": true } }, // 此项指定环境的全局变量,上面的配置指定为浏览器环境 env: { "browser": true, "node": true, "commonjs": true, "es6": true, "amd": true }, // https://github.com/standard/standard/blob/master/docs/RULES-en.md // 此项是用来配置规范的js格调,就是说写代码的时候要标准的写,如果你应用vs-code我感觉应该能够防止出错 extends: 'vue', // 此项是用来提供插件的,插件名称省略了eslint-plugin-,上面这个配置是用来标准html的 plugins: [ 'html', "flow-vars", "react" ], /* 上面这些rules是用来设置从插件来的标准代码的规定,应用必须去掉前缀eslint-plugin- 次要有如下的设置规定,能够设置字符串也能够设置数字,两者成果统一 "off" -> 0 敞开规定 "warn" -> 1 开启正告规定 "error" -> 2 开启谬误规定 */ rules: { // 不须要 "space-before-function-paren": 0, // 函数定义时括号后面要不要有空格 "eol-last": 0, // 文件以繁多的换行符完结 "no-extra-semi": 0, // 能够多余的冒号 "semi": 0, // 语句能够不须要分号结尾 "eqeqeq": 0, // 必须应用全等 "one-var": 0, // 间断申明 "no-undef": 0, // 能够 有未定义的变量 // 正告 "no-extra-boolean-cast": 1, // 不必要的bool转换 "no-extra-parens": 1, // 非必要的括号 "no-empty": 1, // 块语句中的内容不能为空 "no-use-before-define": [1, "nofunc"], // 未定义前不能应用 "complexity": [1, 10], // 循环复杂度 "no-unused-vars": 1, // 不能有申明后未被应用的变量或参数 // vue "flow-vars/define-flow-type": 1, "flow-vars/use-flow-type": 1, // react "react/jsx-uses-react": 2, "react/jsx-uses-vars": 2, // 谬误 "comma-dangle": [2, "never"], // 对象字面量项尾不能有逗号 "no-debugger": 2, // 禁止应用debugger "no-constant-condition": 2, // 禁止在条件中应用常量表达式 if(true) if(1) "no-dupe-args": 2, // 函数参数不能反复 "no-dupe-keys": 2, // 在创建对象字面量时不容许键反复 {a:1,a:1} "no-duplicate-case": 2, // switch中的case标签不能反复 "no-empty-character-class": 2, // 正则表达式中的[]内容不能为空 "no-invalid-regexp": 2, // 禁止有效的正则表达式 "no-func-assign": 2, // 禁止反复的函数申明 "valid-typeof": 2, // 必须应用非法的typeof的值 "no-unreachable": 2, // 不能有无奈执行的代码 "no-unexpected-multiline": 2, // 防止多行表达式 "no-sparse-arrays": 2, // 禁止稠密数组, [1,,2] "no-shadow-restricted-names": 2, // 严格模式中规定的限度标识符不能作为申明时的变量名应用 "no-cond-assign": 2, // 禁止在条件表达式中应用赋值语句 "no-native-reassign": 2, // 不能重写native对象 // 代码格调 "no-else-return": 1, // 如果if语句外面有return,前面不能跟else语句 "no-multi-spaces": 1, // 不能用多余的空格 "key-spacing": [1, { // 对象字面量中冒号的前后空格 "beforeColon": false, "afterColon": true }], "block-scoped-var": 2, // 块语句中应用var "consistent-return": 2, // return 前面是否容许省略 "accessor-pairs": 2, // 在对象中应用getter/setter "dot-location": [2, "property"], // 对象拜访符的地位,换行的时候在行首还是行尾 "no-lone-blocks": 2, // 禁止不必要的嵌套块 "no-labels": 2, // 禁止标签申明 "no-extend-native": 2, // 禁止扩大native对象 "no-floating-decimal": 2, // 禁止省略浮点数中的0 .5 3. "no-loop-func": 2, // 禁止在循环中应用函数(如果没有援用内部变量不造成闭包就能够) "no-new-func": 2, // 禁止应用new Function "no-self-compare": 2, // 不能比拟本身 "no-sequences": 2, // 禁止应用逗号运算符 "no-throw-literal": 2, // 禁止抛出字面量谬误 throw "error"; "no-return-assign": [2, "always"], // return 语句中不能有赋值表达式 "no-redeclare": [2, { // 禁止反复申明变量 "builtinGlobals": true }], "no-unused-expressions": [2, { // 禁止无用的表达式 "allowShortCircuit": true, "allowTernary": true }], "no-useless-call": 2, // 禁止不必要的call和apply "no-useless-concat": 2, "no-void": 2, // 禁用void操作符 "no-with": 2, // 禁用with "space-infix-ops": 2, // 中断操作符四周要不要有空格 "valid-jsdoc": [2, { // jsdoc规定 "requireParamDescription": true, "requireReturnDescription": true }], "no-warning-comments": [2, { // 不能有正告备注 "terms": ["todo", "fixme", "any other term"], "location": "anywhere" }], "curly": 1, // 必须应用 if(){} 中的{} // common js "no-duplicate-imports": 1 }}vscode装置prettier插件如果想要保留代码时就主动格式化 ,能够在vscode中装置插件 ...

September 16, 2021 · 3 min · jiezi

关于vue.js:最好的字符串函数介绍

C字符串复制到指标指向的数组中,包含终止的空字符(并在该点进行)。为了防止溢出,指标指向的数组的大小应该足够长,以蕴含与源雷同的C字符串(包含终止的空字符),并且不应该在内存中与源重叠2.strcpy的模仿实现char strcpy ( char destination, const char * source )这是函数的根本返回类型和参数的类型,星池starpool 其中源字符串不能够被扭转,所以咱们加上const润饰.用于比拟两个字符串并依据比拟后果返回整数。根本模式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回正数;若str1>str2,则返回负数。 两个字符串自左向右一一字符相比(按 ASCII 值大小相比拟),https://www.starpool.cn 直到呈现不同的字符或遇 \0 为止。如:原型为void memcpy(void destin, void *source, unsigned n);函数的性能是从源内存地址的起始地位开始拷贝若干个字节到指标内存地址中,即从源source中拷贝n个字节到指标destin中

September 16, 2021 · 1 min · jiezi

关于vue.js:如何在Vue项目中使用JSX

Author:ManStruggling什么是 JSX?JSX是一种JavaScript和XML的联合,即JavaScript + XML = JSX,JSX源于Facebook,能够在JavaScript里写XML,因为这个个性,所以具备了JavaScript的灵活性,同时又兼具html的语义化和直观性 为什么应用 JSX?jsx比照createElement函数可读性更强;<div></div> VS this.$createElement('div', {...}, [...])vue-cli3.0及以上默认反对jsx语法jsx能够使vue组件更容易导入和治理首先来横向比照一下<template></template>模板语法、createElement函数、jsx三种渲染形式 栗子一template模板语法应用最多,不做解释<div id="vnode"> 一些文本 <p class="bar" style="color: red; font-weight: bold;">Only you can stop forest fires</p> <span>span text</span> <b>b tag</b></div>createElementcreateElement函数实际上创立的是Virtual Node,创立VNode树,一旦Dom树的结构复杂,dom节点属性太多,势必会造成可读性差的问题。。。render(h) { return h( "div", { attrs: { id: "vnode", }, }, [ "一些文本", h( "p", { class: { bar: true, }, style: { color: "red", fontWeight: "bold", }, }, "Only you can stop forest fires" ), h("span", {}, "span text"), h("b", { domProps: { innerText: "b tag" } }), ] ); }JSX而后jsx就闪亮退场render() { return ( <div id="vnode"> 一些文本 <p class="bar" style="color: red; font-weight: bold;"> Only you can stop forest fires </p> <span>span text</span> <b>b tag</b> </div> ); }可能有的同学感觉,就这,跟template没什么区别呀。 ...

September 15, 2021 · 3 min · jiezi