,只能出现在其它某些特定的元素内部。
所以上面
会被作为无效的内容提升到外部,并导致最终渲染结果出错。应该这么写:
28.prop 验证的 type 类型有哪几种?
String、Number、Boolean、Array、Object、Date、Function、Symbol, 此外还可以是一个自定义的构造函数 Personnel,并且通过 instanceof 来验证 propwokrer 的值是否是通过这个自定义的构造函数创建的。
function Personnel ( name, age) {
this . name = name;
this . age = age;
}
export default {
props: {
wokrer: Personnel
}
}
29.在 Vue 事件中传入 $event
,使用 $event.target和 event.currentTarget 有什么区别?
$event.currentTarget
始终指向事件所绑定的元素,而 $event.target
指向事件发生时的元素。
30.使用事件修饰符要注意什么?
要注意顺序很重要,用 @click.prevent.self
会阻止所有的点击,而 @click.self.prevent
只会阻止对元素自身的点击。
31.说说你对 Vue 的表单修饰符.lazy 的理解?
input 标签 v-model 用 lazy 修饰之后,并不会立即监听 input 的 value 的改变,会在 input 失去焦点之后,才会监听 input 的 value 的改变。
32.v-once 的使用场景有哪些?
其作用是只渲染元素和组件一次。随后的重新渲染,元素 / 组件及其所有的子节点将被视为静态内容并跳过。故当组件中有大量的静态的内容可以使用这个指令。
33.v-cloak 和 v-pre 有什么作用?
v-cloak
:可以解决在页面渲染时把未编译的 Mustache 标签({ {value}}
)给显示出来。
[v-cloak] {
display: none!important;
}
{
{ message }}
v-pre:跳过这个元素和它的子元素的编译过程。可以用来显示原始 Mustache 标签。跳过大量没有指令的节点会加快编译。
{
{ this will not be compiled }}
34.怎么使 css 样式只在当前组件中生效?在 style 上加 scoped 属性需要注意哪些?你知道 style 上加 scoped 属性的原理吗?
35.Vue 渲染模板时怎么保留模板中的 HTML 注释呢?
在组件中将 comments
选项设置为 true
...
36.Vue 中怎么重置 data?
Object. assign ( this . $data, this . $options. data ( ) )
37.过滤器中可以用 this 吗?
不可以
38.Vue在created和mounted这两个生命周期中请求数据有什么区别呢?
在created中,页面视图未出现,如果请求信息过多,页面会长时间处于白屏状态,DOM节点没出来,无法操作DOM节点。在mounted不会这样,比较好。
39.说说你对keep-alive的理解
keep-alive是一个抽象组件:它自身不会渲染一个DOM元素,也不会出现在父组件链中;使用keep-alive包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。
其有三个参数
include
定义缓存白名单,会缓存的组件;
exclude
定义缓存黑名单,不会缓存的组件;
以上两个参数可以是逗号分隔字符串、正则表达式或一个数组,include="a,b"
、:include="/a|b/"
、:include="['a', 'b']"
;
匹配首先检查组件自身的 name 选项,如果 name 选项不可用,则匹配它的局部注册名称 (父组件 components 选项的键值)。匿名组件不能被匹配;
max
最多可以缓存多少组件实例。一旦这个数字达到了,在新实例被创建之前,已缓存组件中最久没有被访问的实例会被销毁掉;
不会在函数式组件中正常工作,因为它们没有缓存实例;
当组件在内被切换,它的activated和deactivated这两个生命周期钩子函数将会被对应执行。
40.v-if和v-for的优先级是什么?如果这两个同时出现时,那应该怎么优化才能得到更好的性能?
当它们处于同一节点,v-for
的优先级比v-if
更高,这意味着v-if
将分别重复运行于每个v-for
循环中。当你只想为部分项渲染节点时,这种优先级的机制会十分有用。
如果你的目的是有条件地跳过循环的执行,那么可以将 v-if 置于外层元素 (或
)上。
41.使用v-for遍历对象时,是按什么顺序遍历的?如何保证顺序?
按 Object.keys() 的顺序的遍历,转成数组保证顺序。
42.key除了在v-for中使用,还有什么作用?
还可以强制替换元素/组件而不是重复使用它。在以下场景可以使用
{
{ text }}
当 text 发生改变时,
会随时被更新,因此会触发过渡。
43.使用key要什么要注意的吗?
不要使用对象或数组之类的非基本类型值作为key,请用字符串或数值类型的值;
不要使用数组的index作为key值,因为在删除数组某一项,index也会随之变化,导致key变化,渲染会出错。
例:在渲染[a,b,c]
用 index 作为 key,那么在删除第二项的时候,index 就会从 0 1 2 变成 0 1(而不是 0 2),随之第三项的key变成1了,就会误把第三项删除了。
44.说说组件的命名规范
给组件命名有两种方式,一种是使用链式命名my-component,一种是使用大驼峰命名MyComponent,
在字符串模板中
和
都可以使用,
在非字符串模板中最好使用
,因为要遵循W3C规范中的自定义组件名
(字母全小写且必须包含一个连字符),避免和当前以及未来的 HTML 元素相冲突。
45.为什么组件中data必须用函数返回一个对象?
对象为引用类型,当重用组件时,由于数据对象都指向同一个data对象,当在一个组件中修改data时,其他重用的组件中的data会同时被修改;而使用返回对象的函数,由于每次返回的都是一个新对象(Object的实例),引用地址不同,则不会出现这个问题。
46.组件的name选项有什么作用?
递归组件时,组件调用自身使用;
用is
特殊特性和component
内置组件标签时使用;
keep-alive
内置组件标签中include
和exclude
属性中使用。
47.说下$attrs
和$listeners
的使用场景?
$attrs
: 包含了父作用域中(组件标签)不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。 在创建基础组件时候经常使用,可以和组件选项inheritAttrs:false
和配合使用在组件内部标签上用v-bind="$attrs"
将非prop特性绑定上去;
$listeners
: 包含了父作用域中(组件标签)的 (不含.native
) v-on 事件监听器。 在组件上监听一些特定的事件,比如focus事件时,如果组件的根元素不是表单元素的,则监听不到,那么可以用v-on="$listeners"
绑定到表单元素标签上解决。
48.EventBus注册在全局上时,路由切换时会重复触发事件,如何解决呢?
在有使用$on
的组件中要在beforeDestroy
钩子函数中用$off
销毁。
49.Vue组件里写的原生addEventListeners监听事件,要手动去销毁吗?为什么?
要,不然会造成多次绑定和内存泄露。
50.Vue组件里的定时器要怎么销毁?
如果页面上有很多定时器,可以在data
选项中创建一个对象timer
,给每个定时器取个名字一一映射在对象timer
中,在beforeDestroy
构造函数中for(let k in this.timer){clearInterval(k)}
;
如果页面只有单个定时器,可以这么做。
const timer = setInterval(() =>{}, 500);
this.$once('hook:beforeDestroy', () => {
clearInterval(timer);
})
51.Vue中能监听到数组变化的方法有哪些?为什么这些方法能监听到呢?
push()
、pop()
、shift()
、unshift()
、splice()
、sort()
、reverse()
,这些方法在Vue中被重新定义了,故可以监听到数组变化;
filter()
、concat()
、slice()
,这些方法会返回一个新数组,也可以监听到数组的变化。
52.在Vue中哪些数组变化无法监听,为什么,怎么解决?
利用索引直接设置一个数组项时;
修改数组的长度时。
第一个情况,利用已有索引 直接设置一个数组项时Object.defineProperty()
是可以 监听到,利用不存在的索引 直接设置一个数组项时Object.defineProperty()
是不可以 监听到,但是官方给出的解释是由于JavaScript的限制,Vue不能检测以上数组的变动,其实根本原因是性能问题,性能代价和获得的用户体验收益不成正比。
第二个情况,原因是Object.defineProperty()
不能监听到数组的length
属性。
用this.$set(this.items, indexOfItem, newValue)
或this.items.splice(indexOfItem, 1, newValue)
来解决第一种情况;
用this.items.splice(newLength)
来解决第二种情况。
53.在Vue中哪些对象变化无法监听,为什么,怎么解决?
因为Vue是通过Object.defineProperty
来将对象的key转成getter/setter的形式来追踪变化,但getter/setter只能追踪一个数据是否被修改,无法追踪新增属性和删除属性,所以才会导致上面对象变化无法监听。
用this.$set(this.obj,"key","newValue")
来解决第一种情况;
用Object.assign
来解决第二种情况。
54.删除对象用delete和Vue.delete有什么区别?
delete:只是被删除对象成员变为' '
或undefined
,其他元素键值不变;
Vue.delete:直接删了对象成员,如果对象是响应式的,确保删除能触发更新视图,这个方法主要用于避开 Vue 不能检测到属性被删除的限制。
55.
有什么用?
当做一个不可见的包裹元素,减少不必要的DOM元素,整个结构会更加清晰。
56.Vue怎么定义全局方法
有三种
挂载在Vue的prototype上
// base.js
const install = function (Vue, opts) {
Vue.prototype.demo = function () {
console.log('我已经在Vue原型链上')
}
}
export default {
install
}
复制代码
//main.js
//注册全局函数
import base from 'service/base';
Vue.use(base);
复制代码
利用全局混入mixin
用this.$root.$on
绑定方法,用this.$root.$off
解绑方法,用this.$root.$emit
全局调用。
this.$root.$on('demo',function(){
console.log('test');
})
this.$root.$emit('demo');
this.$root.$off('demo');
57.Vue怎么改变插入模板的分隔符?
用delimiters
选项,其默认是["{ {", "}}"]
// 将分隔符变成ES6模板字符串的风格
new Vue({
delimiters: ['${', '}']
})
58.Vue变量名如果以_、$开头的属性会发生什么问题?怎么访问到它们的值?
以 _
或 $
开头的属性 不会 被 Vue 实例代理,因为它们可能和 Vue 内置的属性、API 方法冲突,你可以使用例如 vm.$data._property
的方式访问这些属性。
59.怎么捕获Vue组件的错误信息?
errorCaptured
是组件内部钩子,当捕获一个来自子孙组件的错误时被调用,接收error
、vm
、info
三个参数,return false
后可以阻止错误继续向上抛出。
errorHandler
为全局钩子,使用Vue.config.errorHandler
配置,接收参数与errorCaptured
一致,2.6后可捕捉v-on
与promise
链的错误,可用于统一错误处理与错误兜底。
60.Vue.observable你有了解过吗?说说看
让一个对象可响应。可以作为最小化的跨组件状态存储器。
61.Vue项目中如何配置favicon?
静态配置
, 其中<%= BASE_URL %>
等同vue.config.js中publicPath
的配置;
动态配置
import browserImg from 'images/kong.png';//为favicon的默认图片
const imgurl ='后端传回来的favicon.ico的线上地址'
let link = document.querySelector('link[type="image/png"]');
if (imgurl) {
link.setAttribute('href', imgurl);
} else {
link.setAttribute('href', browserImg);
}
62.怎么修改Vue项目打包后生成文件路径?
在Vue CLI2中修改config/index.js文件中的build.assetsPublicPath
的值;
在Vue CLI3中配置publicPath的值。
63.怎么解决Vue项目打包后静态资源图片失效的问题?
在项目中一般通过配置alias路径别名的方式解决,下面是Vue CLI3的配置。
configureWebpack: {
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'@': resolve('src'),
'assets': resolve('src/assets'),
'css': resolve('src/assets/css'),
'images': resolve('src/assets/images'),
}
},
},
64.怎么解决Vue中动态设置img的src不生效的问题?
因为动态添加src被当做静态资源处理了,没有进行编译,所以要加上require。
65.在Vue项目中如何引入第三方库(比如jQuery)?有哪些方法可以做到?
先在主入口页面 index.html 中用 script 标签引入
,如果你的项目中有用ESLint检测,会报'$' is not defined
,要在文件中加上/* eslint-disable */
先在主入口页面 index.html 中用 script 标签引入
,然后在webpack 中配置一个 externals,即可在项目中使用。
externals: {
'jquery': 'jQuery'
}
先在webpack中配置alias,最后在main.js中用import $ from 'jquery'
,即可在项目中使用。
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'@': resolve('src'),
'jquery': resolve('static/jquery-1.12.4.js')
}
}
在webpack中新增一个plugins,即可在项目中使用
plugins: [
new webpack.ProvidePlugin({
$:"jquery",
jQuery:"jquery",
"windows.jQuery":"jquery"
})
]
66.说说你对SPA单页面的理解,它的优缺点分别是什么?
是一种只需要将单个页面加载到服务器之中的web应用程序。当浏览器向服务器发出第一个请求时,服务器会返回一个index.html文件,它所需的js,css等会在显示时统一加载,部分页面按需加载。url地址变化时不会向服务器在请求页面,通过路由才实现页面切换。
优点:
良好的交互体验,用户不需要重新刷新页面,获取数据也是通过Ajax异步获取,页面显示流畅;
良好的前后端工作分离模式。
缺点:
SEO难度较高,由于所有的内容都在一个页面中动态替换显示,所以在SEO上其有着天然的弱势。
首屏加载过慢(初次加载耗时多)
67.SPA单页面的实现方式有哪些?
68.说说你对Object.defineProperty的理解
Object.defineProperty(obj,prop,descriptor)方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
obj:要在其上定义属性的对象。
prop:要定义或修改的属性的名称。
descriptor:将被定义或修改的属性描述符。
descriptor属性描述符主要有两种形式:数据描述符和存取描述符。
描述符必须是这两种形式之一;不能同时是两者。
数据描述符和存取描述符共同拥有
configurable:特性表示对象的属性是否可以被删除,以及除value和writable特性外的其他特性是否可以被修改。默认为false。
enumerable:当该属性的enumerable为true时,该属性才可以在for…in循环和Object.keys()中被枚举。默认为false。
数据描述符
value:该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为undefined。
writable:当且仅当该属性的writable为true时,value才能被赋值运算符改变。默认为false。
存取描述符
get:一个给属性提供 getter的方法,如果没有getter则为undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。默认为undefined。
set:一个给属性提供 setter的方法,如果没有setter则为undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。默认为undefined。
定义descriptor时,最好先把这些属性都定义清楚,防止被继承和继承时出错。
function Archiver() {
var temperature = null;
var archive = [];
Object.defineProperty(this, 'temperature', {
get: function() {
console.log('get!');
return temperature;
},
set: function(value) {
temperature = value;
archive.push({ val: temperature });
}
});
this.getArchive = function() { return archive; };
}
var arc = new Archiver();
arc.temperature; // 'get!'
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive(); // [{ val: 11 }, { val: 13 }]
69.说说你对Proxy的理解
官方定义:proxy对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。
通俗来说是在对目标对象的操作之前提供了拦截,对外界的操作进行过滤和修改某些操作的默认行为,可以不直接操作对象本身,而是通过操作对象的代理对象来间接来操作对象。
let proxy = new Proxy(target, handler)
target
是用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理);
handler
一个对象,其属性是当执行一个操作时定义代理的行为的函数,也就是自定义的行为。
handle
可以为{}
,但是不能为null
,否则会报错
Proxy 目前提供了 13 种可代理操作,比较常用的
handler.get(target,property,receiver)获取值拦截
handler.set(target,property,value,receiver)设置值拦截
handler.has(target,prop)in 操作符拦截
let obj = {
a : 1,
b : 2
}
let test = new Proxy(obj,{
get : function (target,property) {
return property in target ? target[property] : 0
},
set : function (target,property,value) {
target[property] = 6;
},
has: function (target,prop){
if(prop == 'b'){
target[prop] = 6;
}
return prop in target;
},
})
console.log(test.a); // 1
console.log(test.c); // 0
test.a = 3;
console.log(test.a) // 6
if('b' in test){
console.log(test) // Proxy {a: 6, b: 6}
}
70.Object.defineProperty和Proxy的区别
Object.defineProperty
不能监听到数组length属性的变化;
不能监听对象的添加;
只能劫持对象的属性,因此我们需要对每个对象的每个属性进行遍历。
Proxy
可以监听数组length属性的变化;
可以监听对象的添加;
可代理整个对象,不需要对对象进行遍历,极大提高性能;
多达13种的拦截远超Object.defineProperty只有get和set两种拦截。
71.Vue的模板语法用的是哪个web模板引擎的吗?说说你对这模板引擎的理解?
采用的是Mustache的web模板引擎mustache.js
72.你认为Vue的核心是什么?
Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统。
73.说说你对单向数据流和双向数据流的理解
单向数据流是指数据只能从父级向子级传递数据,子级不能改变父级向子级传递的数据。
双向数据流是指数据从父级向子级传递数据,子级可以通过一些手段改变父级向子级传递的数据。
比如用v-model
、.sync
来实现双向数据流。
74.什么是虚拟DOM?
虚拟DOM是将状态映射成视图的众多解决方案中的一种,其是通过状态生成一个虚拟节点树,然后使用虚拟节点树进行渲染生成真实DOM,在渲染之前,会使用新生成的虚拟节点树和上一次虚拟节点树进行对比,只渲染不同的部分。
75.Vue中如何实现一个虚拟DOM?说说你的思路
首先要构建一个VNode的类,DOM元素上的所有属性在VNode类实例化出来的对象上都存在对应的属性。例如tag表示一个元素节点的名称,text表示一个文本节点的文本,chlidren表示子节点等。将VNode类实例化出来的对象进行分类,例如注释节点、文本节点、元素节点、组件节点、函数式节点、克隆节点。
然后通过编译将模板转成渲染函数render,执行渲染函数render,在其中创建不同类型的VNode类,最后整合就可以得到一个虚拟DOM(vnode)。
最后通过patch将vnode和oldVnode进行比较后,生成真实DOM。
76.Vue为什么要求组件模板只能有一个根元素?
当前的virtualDOM差异和diff算法在很大程度上依赖于每个子组件总是只有一个根元素。
77.axios是什么?怎样使用它?怎么解决跨域的问题?
axios 是一个基于 promise 的 HTTP 库,先封装在使用。
使用proxyTable配置解决跨域问题。
比如你要调用http://172.16.13.205:9011/getList
这个接口
先在axios.create()配置baseURL增加标志
const service = axios.create({
baseURL: '/api',
});
复制代码
service.get(getList, {params:data});
然后在config/index.js文件中配置
dev:{
proxyTable: {
'/api': {
target: 'http://172.16.13.205:9011', // 设置你调用的接口域名和端口号
secure: false,
changeOrigin: true,// 跨域
pathRewrite: {
'^/api': '' // 去掉标志
}
}
},
}
复制代码
配置后要重新npm run dev
F12中看到请求是http://localhost:8080/api/getList
,实际上请求是http://172.16.13.205:9011/getList
。
78.如果想扩展某个现有的Vue组件时,怎么做呢?
用mixins混入
用extends,比mixins先触发
用高阶组件HOC封装
79.vue-loader是什么?它有什么作用?
vue-loader是一个webpack的loader,是一个模块转换器,用于把模块原内容按照需求转换成新内容。
它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件。可以解析和转换 .vue 文件,提取出其中的逻辑代码 script、样式代码 style、以及 HTML 模版 template,再分别把它们交给对应的loader去处理。
80.你有使用过JSX吗?说说你对JSX的理解?
JSX就是Javascript和XML结合的一种格式。React发明了JSX,利用HTML语法来创建虚拟DOM。当遇到<
,JSX就当HTML解析,遇到{
就当JavaScript解析。
Vuex
1.什么是Vuex?
Vuex 是一个专为 Vue.js 应用程序开发的状态管理插件。它采用集中式存储管理应用的所有组件的状态,而更改状态的唯一方法是提交mutation,例this.$store.commit('SET_VIDEO_PAUSE', video_pause
,SET_VIDEO_PAUSE
为mutations属性中定义的方法 。
2.Vuex解决了什么问题?
解决两个问题
多个组件依赖于同一状态时,对于多层嵌套的组件的传参将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。
来自不同组件的行为需要变更同一状态。以往采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。以上的这些模式非常脆弱,通常会导致无法维护的代码。
3.什么时候用Vuex?
当项目遇到以下两种场景时
多个组件依赖于同一状态时。
来自不同组件的行为需要变更同一状态。
4.怎么引用Vuex?
先安装依赖nnpm install vuex --save
在项目目录src中建立store文件夹
在store文件夹下新建index.js文件,写入
import Vue from 'vue' ;
import Vuex from 'vuex' ;
Vue. use ( Vuex) ;
const debug = process. env. NODE_ENV !== 'production' ;
const store = new Vuex. Store ( {
strict: debug,
state: {
} ,
getters: {
} ,
mutations: {
} ,
actions: {
}
} )
export default store;
复制代码
然后再main.js文件中引入Vuex,这么写
import Vue from 'vue' ;
import App from './App.vue' ;
import store from './store' ;
const vm = new Vue ( {
store: store,
render: h => h ( App)
} ) . $mount ( '#app' )
5.Vuex的5个核心属性是什么?
分别是 state、getters、mutations、actions、modules 。
6.Vuex中状态储存在哪里,怎么改变它?
存储在state中,改变Vuex中的状态的唯一途径就是显式地提交 (commit) mutation。
7.Vuex中状态是对象时,使用时要注意什么?
因为对象是引用类型,复制后改变属性还是会影响原始数据,这样会改变state里面的状态,是不允许,所以先用深度克隆复制对象,再修改。
8.怎么在组件中批量使用Vuex的state状态?
使用mapState辅助函数, 利用对象展开运算符将state混入computed对象中
import {
mapState} from 'vuex'
export default {
computed: {
... mapState ( [ 'price' , 'number' ] )
}
}
9.Vuex中要从state派生一些状态出来,且多个组件使用它,该怎么做?
使用getter属性,相当Vue中的计算属性computed,只有原状态改变派生状态才会改变。
getter接收两个参数,第一个是state,第二个是getters(可以用来访问其他getter)。
const store = new Vuex. Store ( {
state: {
price: 10 ,
number: 10 ,
discount: 0.7 ,
} ,
getters: {
total: state => {
return state. price * state. number
} ,
discountTotal: ( state, getters) => {
return state. discount * getters. total
}
} ,
} ) ;
复制代码
然后在组件中可以用计算属性computed通过this.$store.getters.total
这样来访问这些派生转态。
computed: {
total ( ) {
return this . $store. getters. total
} ,
discountTotal ( ) {
return this . $store. getters. discountTotal
}
}
10.怎么通过getter来实现在组件内可以通过特定条件来获取state的状态?
通过让getter返回一个函数,来实现给getter传参。然后通过参数来进行判断从而获取state中满足要求的状态。
const store = new Vuex. Store ( {
state: {
todos: [
{
id: 1 , text: '...' , done: true } ,
{
id: 2 , text: '...' , done: false }
]
} ,
getters: {
getTodoById: ( state) => ( id) => {
return state. todos. find ( todo => todo. id === id)
}
} ,
} ) ;
复制代码
然后在组件中可以用计算属性computed通过this.$store.getters.getTodoById(2)
这样来访问这些派生转态。
computed: {
getTodoById ( ) {
return this . $store. getters. getTodoById
} ,
}
mounted ( ) {
console. log ( this . getTodoById ( 2 ) . done)
}
11.怎么在组件中批量使用Vuex的getter属性
使用mapGetters辅助函数, 利用对象展开运算符将getter混入computed 对象中
import {
mapGetters} from 'vuex'
export default {
computed: {
... mapGetters ( [ 'total' , 'discountTotal' ] )
}
}
12.怎么在组件中批量给Vuex的getter属性取别名并使用
使用mapGetters辅助函数, 利用对象展开运算符将getter混入computed 对象中
import {
mapGetters} from 'vuex'
export default {
computed: {
... mapGetters ( {
myTotal: 'total' ,
myDiscountTotal: 'discountTotal' ,
} )
}
}
13.在Vuex中使用mutation要注意什么。
mutation 必须是同步函数
14.Vuex中action和mutation有什么区别?
action 提交的是 mutation,而不是直接变更状态。mutation可以直接变更状态。
action 可以包含任意异步操作。mutation只能是同步操作。
提交方式不同,action 是用this.$store.dispatch('ACTION_NAME',data)
来提交。mutation是用this.$store.commit('SET_NUMBER',10)
来提交。
接收参数不同,mutation第一个参数是state,而action第一个参数是context,其包含了
{
state,
rootState,
commit,
dispatch,
getters,
rootGetters
}
15.Vuex中action和mutation有什么相同点?
第二参数都可以接收外部提交时传来的参数。 this.$store.dispatch('ACTION_NAME',data)
和this.$store.commit('SET_NUMBER',10)
16.在组件中多次提交同一个action,怎么写使用更方便。
使用mapActions辅助函数,在组件中这么使用
methods: {
... mapActions ( {
setNumber: 'SET_NUMBER' ,
} )
}
然后调用this.setNumber(10)
相当调用this.$store.dispatch('SET_NUMBER',10)
17.Vuex中action通常是异步的,那么如何知道action什么时候结束呢?
在action函数中返回Promise,然后再提交时候用then处理
actions: {
SET_NUMBER_A ( {
commit} , data) {
return new Promise ( ( resolve, reject) => {
setTimeout ( ( ) => {
commit ( 'SET_NUMBER' , 10 ) ;
resolve ( ) ;
} , 2000 )
} )
}
}
this . $store. dispatch ( 'SET_NUMBER_A' ) . then ( ( ) => {
} )
18.Vuex中有两个action,分别是actionA和actionB,其内都是异步操作,在actionB要提交actionA,需在actionA处理结束再处理其它操作,怎么实现?
利用ES6的async
和await
来实现。
actions: {
async actionA ( {
commit} ) {
} ,
async actionB ( {
dispatch} ) {
await dispatch ( 'actionA' )
}
}
19.有用过Vuex模块吗,为什么要使用,怎么使用。
有,因为使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。所以将 store 分割成模块(module)。每个模块拥有自己的 state、mutations、actions、getters,甚至是嵌套子模块,从上至下进行同样方式的分割。
在module文件新建moduleA.js和moduleB.js文件。在文件中写入
const state= {
}
const getters= {
}
const mutations= {
}
const actions= {
}
export default {
state,
getters,
mutations,
actions
}
复制代码
然后再index.js引入模块
import Vue from 'vue' ;
import Vuex from 'vuex' ;
Vue. use ( Vuex) ;
import moduleA from './module/moduleA'
import moduleB from './module/moduleB'
const store = new Vuex. Store ( {
modules: {
moduleA,
moduleB
}
} )
export default store
20.在模块中,getter和mutation接收的第一个参数state,是全局的还是模块的?
第一个参数state是模块的state,也就是局部的state。
21.在模块中,getter和mutation和action中怎么访问全局的state和getter?
在getter中可以通过第三个参数rootState访问到全局的state,可以通过第四个参数rootGetters访问到全局的getter。
在mutation中不可以访问全局的satat和getter,只能访问到局部的state。
在action中第一个参数context中的context.rootState
访问到全局的state,context.rootGetters
访问到全局的getter。
22.在组件中怎么访问Vuex模块中的getter和state,怎么提交mutation和action?
直接通过this.$store.getters
和this.$store.state
来访问模块中的getter和state。
直接通过this.$store.commit('mutationA',data)
提交模块中的mutation。
直接通过this.$store.dispatch('actionA,data')
提交模块中的action。
23.用过Vuex模块的命名空间吗?为什么使用,怎么使用。
默认情况下,模块内部的action、mutation和getter是注册在全局命名空间,如果多个模块中action、mutation的命名是一样的,那么提交mutation、action时,将会触发所有模块中命名相同的mutation、action。
这样有太多的耦合,如果要使你的模块具有更高的封装度和复用性,你可以通过添加namespaced: true
的方式使其成为带命名空间的模块。
export default {
namespaced: true ,
state,
getters,
mutations,
actions
}
24.怎么在带命名空间的模块内提交全局的mutation和action?
将 { root: true } 作为第三参数传给 dispatch 或 commit 即可。
this . $store. dispatch ( 'actionA' , null , {
root: true } )
this . $store. commit ( 'mutationA' , null , {
root: true } )
25.怎么在带命名空间的模块内注册全局的action?
actions: {
actionA: {
root: true ,
handler ( context, data) {
... }
}
}
26.怎么使用mapState,mapGetters,mapActions和mapMutations这些函数来绑定带命名空间的模块?
首先使用createNamespacedHelpers
创建基于某个命名空间辅助函数
import {
createNamespacedHelpers } from 'vuex' ;
const {
mapState, mapActions } = createNamespacedHelpers ( 'moduleA' ) ;
export default {
computed: {
... mapState ( {
a: state => state. a,
b: state => state. b
} )
} ,
methods: {
... mapActions ( [
'actionA' ,
'actionB'
] )
}
}
27.Vuex插件有用过吗?怎么用简单介绍一下?
Vuex插件就是一个函数,它接收 store 作为唯一参数。在Vuex.Store构造器选项plugins引入。 在store/plugin.js文件中写入
export default function createPlugin ( param) {
return store => {
}
}
复制代码
然后在store/index.js文件中写入
import createPlugin from './plugin.js'
const myPlugin = createPlugin ( )
const store = new Vuex. Store ( {
plugins: [ myPlugin]
} )
28.在Vuex插件中怎么监听组件中提交mutation和action?
用Vuex.Store的实例方法subscribe
监听组件中提交mutation
用Vuex.Store的实例方法subscribeAction
监听组件中提交action 在store/plugin.js文件中写入
export default function createPlugin ( param) {
return store => {
store. subscribe ( ( mutation, state) => {
console. log ( mutation. type)
console. log ( mutation. payload)
console. log ( state)
} )
store. subscribeAction ( {
before: ( action, state) => {
console. log ( `before action ${
action. type} ` )
} ,
after: ( action, state) => {
console. log ( `after action ${
action. type} ` )
}
} )
}
}
复制代码
然后在store/index.js文件中写入
import createPlugin from './plugin.js'
const myPlugin = createPlugin ( )
const store = new Vuex. Store ( {
plugins: [ myPlugin]
} )
29.在v-model上怎么用Vuex中state的值?
需要通过computed计算属性来转换。
< input v- model= "message" >
computed: {
message: {
get ( ) {
return this . $store. state. message
} ,
set ( value) {
this . $store. commit ( 'updateMessage' , value)
}
}
}
30.Vuex的严格模式是什么,有什么作用,怎么开启?
在严格模式下,无论何时发生了状态变更且不是由 mutation函数引起的,将会抛出错误。这能保证所有的状态变更都能被调试工具跟踪到。
在Vuex.Store 构造器选项中开启,如下
const store = new Vuex. Store ( {
strict: true ,
} )
Vue-Router
1.怎么重定向页面?
第一种方法:
const router = new VueRouter({
routes: [
{ path: '/a', redirect: '/b' }
]
})
第二种方法:
const router = new VueRouter({
routes: [
{ path: '/a', redirect: { name: 'foo' }}
]
})
第三种方法:
const router = new VueRouter({
routes: [
{
path: '/a',
redirect: to =>{
const { hash, params, query } = to
if (query.to === 'foo') {
return { path: '/foo', query: null }
}else{
return '/b'
}
}
}
]
})
2.怎么配置404页面?
const router = new VueRouter({
routes: [
{
path: '*', redirect: {path: '/'}
}
]
})
3.切换路由时,需要保存草稿的功能,怎么实现呢?
4.路由有几种模式?说说它们的区别?
hash: 兼容所有浏览器,包括不支持 HTML5 History Api 的浏览器,例http://www.abc.com/#/index,hash值为#/index, hash的改变会触发hashchange事件,通过监听hashchange事件来完成操作实现前端路由。hash值变化不会让浏览器向服务器请求。
// 监听hash变化,点击浏览器的前进后退会触发
window.addEventListener('hashchange', function(event){
let newURL = event.newURL; // hash 改变后的新 url
let oldURL = event.oldURL; // hash 改变前的旧 url
},false)
history: 兼容能支持 HTML5 History Api 的浏览器,依赖HTML5 History API来实现前端路由。没有#
,路由地址跟正常的url一样,但是初次访问或者刷新都会向服务器请求,如果没有请求到对应的资源就会返回404,所以路由地址匹配不到任何静态资源,则应该返回同一个index.html 页面,需要在nginx中配置。
abstract: 支持所有 JavaScript 运行环境,如 Node.js 服务器端。如果发现没有浏览器的 API,路由会自动强制进入这个模式。
5.讲一下完整的导航守卫流程?
导航被触发。
在失活的组件里调用离开守卫beforeRouteLeave(to,from,next)
。
调用全局的beforeEach( (to,from,next) =>{} )
守卫。
在重用的组件里调用 beforeRouteUpdate(to,from,next)
守卫。
在路由配置里调用beforeEnter(to,from,next)
路由独享的守卫。
解析异步路由组件。
在被激活的组件里调用beforeRouteEnter(to,from,next)
。
在所有组件内守卫和异步路由组件被解析之后调用全局的beforeResolve( (to,from,next) =>{} )
解析守卫。
导航被确认。
调用全局的afterEach( (to,from) =>{} )
钩子。
触发 DOM 更新。
用创建好的实例调用beforeRouteEnter守卫中传给 next 的回调函数
beforeRouteEnter(to, from, next) {
next(vm => {
//通过vm访问组件实例
})
},
6.讲一下导航守卫的三个参数的含义?
to:即将要进入的目标 路由对象。
from:当前导航正要离开的路由对象。
next:函数,必须调用,不然路由跳转不过去。
next()
:进入下一个路由。
next(false)
:中断当前的导航。
next('/')
或next({ path: '/' })
: 跳转到其他路由,当前导航被中断,进行新的一个导航。
7.在afterEach钩子中可以使用next()
吗?
不可以,不接受next
的参数。
8.全局导航守卫有哪些?怎么使用?
router.beforeEach
:全局前置守卫。
router.beforeResolve
:全局解析守卫。
router.afterEach
:全局后置钩子。
import VueRouter from 'vue-router';
const router = new VueRouter({
mode: 'history',
base: '/',
routes,
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition;
} else {
return { x: 0, y: 0 };
}
}
})
router.beforeEach((to, from, next) => {
//...
next();
})
router.beforeResolve((to, from, next) => {
//...
next();
})
router.afterEach((to, from) => {
//...
});
9.什么是路由独享的守卫,怎么使用?
是beforeEnter
守卫
const router = new VueRouter({
routes: [
{
path: '/foo',
component: Foo,
beforeEnter: (to, from, next) => {
// ...
}
}
]
})
10.说说你对router-link的了解
是Vue-Router的内置组件,在具有路由功能的应用中作为声明式的导航使用。
有8个props,其作用是:
to
:必填,表示目标路由的链接。当被点击后,内部会立刻把to的值传到 router.push(),所以这个值可以是一个字符串或者是描述目标位置的对象。
Home
Home
Home
User
User
复制代码
注意path存在时params不起作用,只能用query
replace
:默认值为false,若设置的话,当点击时,会调用router.replace()
而不是router.push()
,于是导航后不会留下 history 记录。
append
:设置 append 属性后,则在当前 (相对) 路径前添加基路径。
tag
:让
渲染成tag
设置的标签,如tag:'li
,渲染结果为foo
。
active-class
:默认值为router-link-active
,设置链接激活时使用的 CSS 类名。默认值可以通过路由的构造选项 linkActiveClass 来全局配置。
exact-active-class
:默认值为router-link-exact-active
,设置链接被精确匹配的时候应该激活的 class。默认值可以通过路由构造函数选项 linkExactActiveClass 进行全局配置的。
exact:是否精确匹配,默认为false。
复制代码
event
:声明可以用来触发导航的事件。可以是一个字符串或是一个包含字符串的数组,默认是click
。
11.怎么在组件中监听路由参数的变化?
有两种方法可以监听路由参数的变化,但是只能用在包含
的组件内。
第一种
watch: {
'$route'(to, from) {
//这里监听
},
},
复制代码
第二种
beforeRouteUpdate (to, from, next) {
//这里监听
},
12.切换路由后,新页面要滚动到顶部或保持原先的滚动位置怎么做呢?
滚动顶部
const router = new Router({
mode: 'history',
base: process.env.BASE_URL,
routes,
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition;
} else {
return { x: 0, y: 0 };
}
}
});
13.路由组件和路由为什么解耦,怎么解耦?
因为在组件中使用 $route 会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的 URL 上使用,限制了其灵活性,所有要解耦。
耦合如以下代码所示。Home组件只有在
http://localhost:8036/home/123
URL上才能使用。
const Home = {
template: 'User {
{ $route.params.id }}
'
}
const router = new VueRouter({
routes: [
{ path: '/home/:id', component: Home }
]
})
复制代码
使用 props 来解耦
props为true,route.params
将会被设置为组件属性。
props为对象,则按原样设置为组件属性。
props为函数,http://localhost:8036/home?id=123
,会把123传给组件Home的props的id。
const Home = {
props: ['id'],
template: 'User {
{ id }}
'
}
const router = new VueRouter({
routes: [
{ path: '/home/:id', component: Home, props: true},
// 对于包含命名视图的路由,你必须分别为每个命名视图添加 `props` 选项:
{
path: '/home/:id',
components: { default: Home, sidebar: Sidebar },
props: { default: true, sidebar: false }
}
{ path: '/home', component: Home, props: {id:123} },
{ path: '/home', component: Home, props: (route) => ({ id: route.query.id }) },
]
})
14.说说active-class是哪个组件的属性?
组件的属性,设置链接激活时使用的 CSS 类名。默认值可以通过路由的构造选项 linkActiveClass 来全局配置。
15.怎样动态加载路由?
使用Router的实例方法addRoutes来实现动态加载路由,一般用来实现菜单权限。
使用时要注意,静态路由文件中不能有404路由,而要通过addRoutes一起动态添加进去。
const routes = [
{
path: '/overview',
name: 'overview',
component: () => import('@/views/account/overview/index'),
meta: {
title: '账户概览',
pid: 869,
nid: 877
},
},
{
path: '*',
redirect: {
path: '/'
}
}
]
vm.$router.options.routes.push(...routes);
vm.$router.addRoutes(routes);
16.怎么实现路由懒加载呢?
function load(component) {
//return resolve => require([`views/${component}`], resolve);
return () => import(`views/${component}`);
}
const routes = [
{
path: '/home',
name: 'home',
component: load('home'),
meta: {
title: '首页'
},
},
]
17.路由之间是怎么跳转的?有哪些方式?
声明式 通过使用内置组件
来跳转
编程式 通过调用router实例的push方法router.push({ path: '/home' })
或replace方法router.replace({ path: '/home' })
18.如果vue-router使用history模式,部署时要注意什么?
要注意404的问题,因为在history模式下,只是动态的通过js操作window.history来改变浏览器地址栏里的路径,并没有发起http请求,当直接在浏览器里输入这个地址的时候,就一定要对服务器发起http请求,但是这个目标在服务器上又不存在,所以会返回404。
所以要在Ngnix中将所有请求都转发到index.html上就可以了。
location / {
try_files $uri $uri/ @router index index.html;
}
location @router {
rewrite ^.*$ /index.html last;
}
19.route和router有什么区别?
route是“路由信息对象”,包括path,params,hash,query,fullPath,matched,name等路由信息参数。 而router是“路由实例对象”,包括了路由的跳转方法,钩子函数等。
20.Vue路由怎么跳转打开新窗口?
const obj = {
path: xxx,//路由地址
query: {
mid: data.id//可以带参数
}
};
const {href} = this.$router.resolve(obj);
window.open(href, '_blank');
你可能感兴趣的:(vue,vue.js)
element实现动态路由+面包屑
软件技术NINI
vue案例 vue.js 前端
el-breadcrumb是ElementUI组件库中的一个面包屑导航组件,它用于显示当前页面的路径,帮助用户快速理解和导航到应用的各个部分。在Vue.js项目中,如果你已经安装了ElementUI,就可以很方便地使用el-breadcrumb组件。以下是一个基本的使用示例:安装ElementUI(如果你还没有安装的话):你可以通过npm或yarn来安装ElementUI。bash复制代码npmi
node.js学习
小猿L
node.js node.js 学习 vim
node.js学习实操及笔记温故node.js,node.js学习实操过程及笔记~node.js学习视频node.js官网node.js中文网实操笔记githubcsdn笔记为什么学node.js可以让别人访问我们编写的网页为后续的框架学习打下基础,三大框架vuereactangular离不开node.jsnode.js是什么官网:node.js是一个开源的、跨平台的运行JavaScript的运行
vue3中el-table中点击图片放大时,被表格覆盖
叫我小鹏呀
vue.js javascript 前端
问题:vue3中el-table中点击图片放大时,被表格覆盖。解决方法:el-image添加preview-teleported
vue项目element-ui的table表格单元格合并
酋长哈哈
vue.js elementui javascript 前端
一、合并效果二全部代码exportdefault{name:'CellMerge',data(){return{tableData:[{id:'1',name:'王小虎',amount1:'165',amount2:'3.2',amount3:10},{id:'1',name:'王小虎',amount1:'162',amount2:'4.43',amount3:12},{id:'1',name:'
Vue中table合并单元格用法
weixin_30613343
javascript ViewUI
地名结果人名性别{{item.name}}已完成未完成{{item.groups[0].name}}{{item.groups[0].sex}}{{item.groups[son].name}}{{item.groups[son].sex}}exportdefault{data(){return{list:[{name:'地名1',result:'1',groups:[{name:'张三',sex
springboot+vue项目实战一-创建SpringBoot简单项目
苹果酱0567
面试题汇总与解析 spring boot 后端 java 中间件 开发语言
这段时间抽空给女朋友搭建一个个人博客,想着记录一下建站的过程,就当做笔记吧。虽然复制zjblog只要一个小时就可以搞定一个网站,或者用cms系统,三四个小时就可以做出一个前后台都有的网站,而且想做成啥样也都行。但是就是要从新做,自己做的意义不一样,更何况,俺就是专门干这个的,嘿嘿嘿要做一个网站,而且从零开始,首先呢就是技术选型了,经过一番思量决定选择-SpringBoot做后端,前端使用Vue做一
Vue( ElementUI入门、vue-cli安装)
m0_l5z
elementui vue.js
一.ElementUI入门目录:1.ElementUI入门1.1ElementUI简介1.2Vue+ElementUI安装1.3开发示例2.搭建nodejs环境2.1nodejs介绍2.2npm是什么2.3nodejs环境搭建2.3.1下载2.3.2解压2.3.3配置环境变量2.3.4配置npm全局模块路径和cache默认安装位置2.3.5修改npm镜像提高下载速度2.3.6验证安装结果3.运行n
博客网站制作教程
2401_85194651
java maven
首先就是技术框架:后端:Java+SpringBoot数据库:MySQL前端:Vue.js数据库连接:JPA(JavaPersistenceAPI)1.项目结构blog-app/├──backend/│├──src/main/java/com/example/blogapp/││├──BlogApplication.java││├──config/│││└──DatabaseConfig.java
vue+el-table 可输入表格使用上下键进行input框切换
以对_
vue学习记录 vue.js javascript 前端
使用上下键进行完工数量这一列的切换-->//键盘触发事件show(ev,index){letnewIndex;letinputAll=document.querySelectorAll('.table_inputinput');//向上=38if(ev.keyCode==38){if(index==0){//如果是第一行,回到最后一个newIndex=inputAll.length-1}elsei
vue + Element UI table动态合并单元格
我家媳妇儿萌哒哒
element UI vue.js 前端 javascript
一、功能需求1、根据名称相同的合并工作阶段和主要任务合并这两列,但主要任务内容一样,但要考虑主要任务一样,但工作阶段不一样的情况。(枞向合并)2、落实情况里的定量内容和定性内容值一样则合并。(横向合并)二、功能实现exportdefault{data(){return{tableData:[{name:'a',address:'1',age:'1',six:'2'},{name:'a',addre
vue 创建项目报错:command failed: npm install --loglevel error
那鱼、会飞
vue.js vue-cli3
这个问题其实很好解决,只是很多种情况,逐一排除即可。稳下心来~vuecli3创建项目我的node版本是node14.15.0,(永远不要尝试最新版本)node各种版本下载地址:以往的版本|Node.js(nodejs.org)vue/
[email protected] @vue/
[email protected] (注意vue/cli2和vue/cli3的下载命名有所改变,2是-形式,3是/形式)其实报错
计算机毕业设计PHP仓储综合管理系统(源码+程序+VUE+lw+部署)
java毕设程序源码王哥
php 课程设计 vue.js
该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流项目运行环境配置:phpStudy+Vscode+Mysql5.7+HBuilderX+Navicat11+Vue+Express。项目技术:原生PHP++Vue等等组成,B/S模式+Vscode管理+前后端分离等等。环境需要1.运行环境:最好是小皮phpstudy最新版,我们在这个版本上开发的。其他版本理论上也可以。2.开发
字节二面
Redstone Monstrosity
前端 面试
1.假设你是正在面试前端开发工程师的候选人,面试官让你详细说出你上一段实习过程的收获和感悟。在上一段实习过程中,我获得了宝贵的实践经验和深刻的行业洞察,以下是我的主要收获和感悟:一、专业技能提升框架应用熟练度:通过实际项目,我深入掌握了React、Vue等前端框架的使用,不仅提升了编码效率,还学会了如何根据项目需求选择合适的框架。问题解决能力:在实习期间,我遇到了许多预料之外的技术难题。通过查阅文
vue render 函数详解 (配参数详解)
你的眼睛會笑
vue2 vue.js javascript 前端
vuerender函数详解(配参数详解)在Vue3中,`render`函数被用来代替Vue2中的模板语法。它接收一个h函数(或者是`createElement`函数的别名),并且返回一个虚拟DOM。render函数的语法结构如下:render(h){returnh('div',{class:'container'},'Hello,World!')}在上面的示例中,我们使用h函数创建了一个div元素
前端代码上传文件
余生逆风飞翔
前端 javascript 开发语言
点击上传文件import{ElNotification}from'element-plus'import{API_CONFIG}from'../config/index.js'import{UploadFilled}from'@element-plus/icons-vue'import{reactive}from'vue'import{BASE_URL}from'../config/index'i
VUE3 + xterm + nestjs实现web远程终端 或 连接开启SSH登录的路由器和交换机。
焚木灵
node.js vue
可远程连接系统终端或开启SSH登录的路由器和交换机。相关资料:xtermjs/xterm.js:Aterminalfortheweb(github.com)后端实现(NestJS):1、安装依赖:npminstallnode-ssh@nestjs/websockets@nestjs/platform-socket.io2、我们将创建一个名为RemoteControlModule的NestJS模块,
详解“c:/work/src/components/a/b.vue“‘ has no default export报错原因
hw_happy
开发语言 前端 vue.js javascript
前情提要在一个vue文件中需要引入定义的b.vue文件,但是提示b文件没有默认导出,对于vue2文件来说有exportdefault,在中,所有定义的变量、函数和组件都会自动被视为默认导出的组件内容。因此,不需要显式地使用exportdefault来导出组件。但是在我引用这个文件的时候还是提示了这个错误,原来是我的项目使用了ts和vite\webpack,因为TypeScript和Vue的默认导出
Vue 项目运行时,报错 Error: Cannot find module ‘node:path‘
周bro
vue.js 前端 javascript node.js npm
node-v是否显示nodenpm-v报错Error:Cannotfindmodule‘node:path'是因为node版本和npm版本不匹配安装相对应的版本node版本10.16.0对应npm版本
[email protected] 执行该命令即可匹配版本官网https://nodejs.org/en/about/previous-releases
vue2实现复制,粘贴功能
周bro
vue.js javascript 前端
一、需求说明在项目中点击按钮复制某行文本是很常见的应用场景,在Vue项目中实现复制功能需要借助vue-clipboard2插件。二、代码实现1、安装vue-clipboard2依赖(出现错误的话,可以试试切换成淘宝镜像源npmconfigsetregistryhttps://registry.npm.taobao.org)npminstall--savevue-clipboard22、在main.
【vite 自动配置路由】
CODER-V
前端 javascript vue.js 前端 软件构建
手动配置路由,是一个没有技术含量又浪费时间的工作。本文将介绍vite构建的vue3项目如何编写一个自动配置路由的脚本。约定大于配置要想使用脚本完成路由的自动配置,我们就需要遵循以下目录规则:每一个页面对应一个包,当前包下的主页面命名为index.vue;每个包里必须配置一个page.js;在每一个page.js里边配置,额外的路由信息,比如:exportdefault{title:'商品',men
Vue + Express实现一个表单提交
九旬大爷的梦
最近在折腾一个cms系统,用的vue+express,但是就一个表单提交就弄了好久,记录一下。环境:Node10+前端:Vue服务端:Express依赖包:vueexpressaxiosexpress-formidableelement-ui(可选)前言:axiosget请求参数是:paramsaxiospost请求参数是:dataexpressget接受参数是req.queryexpresspo
Vue3 vant组件库自动导入
不叫虎子
Vue vue.js 前端 javascript 前端框架 typescript
实现:完整使用vant组件库文档安装:#Vue3项目,安装最新版Vantnpmivant#通过yarn安装yarnaddvant#通过pnpm安装pnpmaddvant【一】按需引入:https://vant-contrib.gitee.io/vant/#/zh-CN/quickstart#fang-fa-er.-an-xu-yin-ru-zu-jian-yang-shi【二】批量引入在基于vit
vant-element-ts一起使用存在的问题
flynn_
问题总结 vue
由于vant-ui与element-ui部分组件存在冲突,导致在vue-typescript中出现错误:Subsequentpropertydeclarationsmusthavethesametype.Property'$notify'mustbeoftype'ElNotification',butherehastype'Notify'.方案:一个全局导入,一个按需导入,避免冲突的组件同时使用,
第三十一节:Vue路由:前端路由vs后端路由的了解
曹老师
1.认识前端路由和后端路由前端路由相对于后端路由而言的,在理解前端路由之前先对于路由有一个基本的了解路由:简而言之,就是把信息从原地址传输到目的地的活动对于我们来说路由就是:根据不同的url地址展示不同的页面内容1.1后端路由以前咱们接触比较多的后端路由,当改变url地址时,浏览器会向服务器发送请求,服务器根据这个url,返回不同的资源内容后端路由的特点就是前端每次跳转到不同url地址,都会重新访
基于JavaWeb开发的Java+SpringMvc+vue+element实现上海汽车博物馆平台
网顺技术团队
成品程序项目 java vue.js 汽车 课程设计 spring boot
基于JavaWeb开发的Java+SpringMvc+vue+element实现上海汽车博物馆平台作者主页网顺技术团队欢迎点赞收藏⭐留言文末获取源码联系方式查看下方微信号获取联系方式承接各种定制系统精彩系列推荐精彩专栏推荐订阅不然下次找不到哟Java毕设项目精品实战案例《1000套》感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人文章目录基
【前端】vue 报错:The template root requires exactly one element
程序员-张师傅
前端 前端 vue.js javascript
【前端】vue报错:Thetemplaterootrequiresexactlyoneelement在Vue.js中,当你遇到错误“Thetemplaterootrequiresexactlyoneelement”时,这通常意味着你的Vue组件的模板(template)根节点不是单一的元素。Vue要求每个组件的模板必须有一个根元素来包裹所有的子元素。这个错误通常出现在以下几种情况:模板中有多个并行
C# 开发教程-入门基础
天马3798
教程系列整理 c# 开发语言
1.C#简介、环境,程序结构2.C#基本语法,变量,控制局域,数据类型,类型转换3.C#数组、循环,Linq4.C#类,封装,方法5.C#枚举、字符串6.C#面相对象,继承,封装,多态7.C#特性、属性、反射、索引器8.C#委托,事件,集合,泛型9.C#匿名方法10.C#多线程更多:JQuery开发教程入门基础Vue开发基础入门教程Vue开发高级学习教程
若依后端正常启动但是uniapp移动端提示后端接口异常
大可大可抖
uni-app
pc端能用模拟器也能正常连接接口,手机端真机调试连不上接口解决:1.先看config.js的填自己的ip地址module.exports={//baseUrl:'https://vue.ruoyi.vip/prod-api',baseUrl:"http://192.168.101.5:8080",}2.网络环境问题(防火墙)点击属性然后选择专用
好看的vue登录页面(附 源代码 背景图)
小小薛定谔
vue.js javascript css 前端
一、效果展示二、代码你好!欢迎回来登录忘记密码?注册exportdefault{name:"MedLogin",data(){return{confirm_disabled:false,loginForm:{no:'',password:''},rules:{no:[{required:true,message:'请输入账号',trigger:'blur'},{min:3,max:6,messag
uniapp 获取各种小程序code
灵魂清零
uniapp 小程序
各种小程序在进入小程序是都需要去获取code才能拿到基础信息,自己记录一下用uniapp开发小程序是获取微信小程序、百度小程序、头条小程序、支付宝小程序的codeVue.prototype.$global={appLogin(){returnnewPromise((resole,reject)=>{varthat=this;varwxLoginUrl=app.globalData.url+"/lo
戴尔笔记本win8系统改装win7系统
sophia天雪
win7 戴尔 改装系统 win8
戴尔win8 系统改装win7 系统详述
第一步:使用U盘制作虚拟光驱:
1)下载安装UltraISO:注册码可以在网上搜索。
2)启动UltraISO,点击“文件”—》“打开”按钮,打开已经准备好的ISO镜像文
BeanUtils.copyProperties使用笔记
bylijinnan
java
BeanUtils.copyProperties VS PropertyUtils.copyProperties
两者最大的区别是:
BeanUtils.copyProperties会进行类型转换,而PropertyUtils.copyProperties不会。
既然进行了类型转换,那BeanUtils.copyProperties的速度比不上PropertyUtils.copyProp
MyEclipse中文乱码问题
0624chenhong
MyEclipse
一、设置新建常见文件的默认编码格式,也就是文件保存的格式。
在不对MyEclipse进行设置的时候,默认保存文件的编码,一般跟简体中文操作系统(如windows2000,windowsXP)的编码一致,即GBK。
在简体中文系统下,ANSI 编码代表 GBK编码;在日文操作系统下,ANSI 编码代表 JIS 编码。
Window-->Preferences-->General -
发送邮件
不懂事的小屁孩
send email
import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.MultiPartEmail;
动画合集
换个号韩国红果果
html css
动画 指一种样式变为另一种样式 keyframes应当始终定义0 100 过程
1 transition 制作鼠标滑过图片时的放大效果
css
.wrap{
width: 340px;height: 340px;
position: absolute;
top: 30%;
left: 20%;
overflow: hidden;
bor
网络最常见的攻击方式竟然是SQL注入
蓝儿唯美
sql注入
NTT研究表明,尽管SQL注入(SQLi)型攻击记录详尽且为人熟知,但目前网络应用程序仍然是SQLi攻击的重灾区。
信息安全和风险管理公司NTTCom Security发布的《2015全球智能威胁风险报告》表明,目前黑客攻击网络应用程序方式中最流行的,要数SQLi攻击。报告对去年发生的60亿攻击 行为进行分析,指出SQLi攻击是最常见的网络应用程序攻击方式。全球网络应用程序攻击中,SQLi攻击占
java笔记2
a-john
java
类的封装:
1,java中,对象就是一个封装体。封装是把对象的属性和服务结合成一个独立的的单位。并尽可能隐藏对象的内部细节(尤其是私有数据)
2,目的:使对象以外的部分不能随意存取对象的内部数据(如属性),从而使软件错误能够局部化,减少差错和排错的难度。
3,简单来说,“隐藏属性、方法或实现细节的过程”称为——封装。
4,封装的特性:
4.1设置
[Andengine]Error:can't creat bitmap form path “gfx/xxx.xxx”
aijuans
学习Android遇到的错误
最开始遇到这个错误是很早以前了,以前也没注意,只当是一个不理解的bug,因为所有的texture,textureregion都没有问题,但是就是提示错误。
昨天和美工要图片,本来是要背景透明的png格式,可是她却给了我一个jpg的。说明了之后她说没法改,因为没有png这个保存选项。
我就看了一下,和她要了psd的文件,还好我有一点
自己写的一个繁体到简体的转换程序
asialee
java 转换 繁体 filter 简体
今天调研一个任务,基于java的filter实现繁体到简体的转换,于是写了一个demo,给各位博友奉上,欢迎批评指正。
实现的思路是重载request的调取参数的几个方法,然后做下转换。
android意图和意图监听器技术
百合不是茶
android 显示意图 隐式意图 意图监听器
Intent是在activity之间传递数据;Intent的传递分为显示传递和隐式传递
显式意图:调用Intent.setComponent() 或 Intent.setClassName() 或 Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
隐式意图;不指明调用的名称,根据设
spring3中新增的@value注解
bijian1013
java spring @Value
在spring 3.0中,可以通过使用@value,对一些如xxx.properties文件中的文件,进行键值对的注入,例子如下:
1.首先在applicationContext.xml中加入:
<beans xmlns="http://www.springframework.
Jboss启用CXF日志
sunjing
log jboss CXF
1. 在standalone.xml配置文件中添加system-properties:
<system-properties> <property name="org.apache.cxf.logging.enabled" value=&
【Hadoop三】Centos7_x86_64部署Hadoop集群之编译Hadoop源代码
bit1129
centos
编译必需的软件
Firebugs3.0.0
Maven3.2.3
Ant
JDK1.7.0_67
protobuf-2.5.0
Hadoop 2.5.2源码包
Firebugs3.0.0
http://sourceforge.jp/projects/sfnet_findbug
struts2验证框架的使用和扩展
白糖_
框架 xml bean struts 正则表达式
struts2能够对前台提交的表单数据进行输入有效性校验,通常有两种方式:
1、在Action类中通过validatexx方法验证,这种方式很简单,在此不再赘述;
2、通过编写xx-validation.xml文件执行表单验证,当用户提交表单请求后,struts会优先执行xml文件,如果校验不通过是不会让请求访问指定action的。
本文介绍一下struts2通过xml文件进行校验的方法并说
记录-感悟
braveCS
感悟
再翻翻以前写的感悟,有时会发现自己很幼稚,也会让自己找回初心。
2015-1-11 1. 能在工作之余学习感兴趣的东西已经很幸福了;
2. 要改变自己,不能这样一直在原来区域,要突破安全区舒适区,才能提高自己,往好的方面发展;
3. 多反省多思考;要会用工具,而不是变成工具的奴隶;
4. 一天内集中一个定长时间段看最新资讯和偏流式博
编程之美-数组中最长递增子序列
bylijinnan
编程之美
import java.util.Arrays;
import java.util.Random;
public class LongestAccendingSubSequence {
/**
* 编程之美 数组中最长递增子序列
* 书上的解法容易理解
* 另一方法书上没有提到的是,可以将数组排序(由小到大)得到新的数组,
* 然后求排序后的数组与原数
读书笔记5
chengxuyuancsdn
重复提交 struts2的token验证
1、重复提交
2、struts2的token验证
3、用response返回xml时的注意
1、重复提交
(1)应用场景
(1-1)点击提交按钮两次。
(1-2)使用浏览器后退按钮重复之前的操作,导致重复提交表单。
(1-3)刷新页面
(1-4)使用浏览器历史记录重复提交表单。
(1-5)浏览器重复的 HTTP 请求。
(2)解决方法
(2-1)禁掉提交按钮
(2-2)
[时空与探索]全球联合进行第二次费城实验的可能性
comsci
二次世界大战前后,由爱因斯坦参加的一次在海军舰艇上进行的物理学实验 -费城实验
至今给我们大家留下很多迷团.....
关于费城实验的详细过程,大家可以在网络上搜索一下,我这里就不详细描述了
在这里,我的意思是,现在
easy connect 之 ORA-12154: TNS: 无法解析指定的连接标识符
daizj
oracle ORA-12154
用easy connect连接出现“tns无法解析指定的连接标示符”的错误,如下:
C:\Users\Administrator>sqlplus username/
[email protected] :1521/orcl
SQL*Plus: Release 10.2.0.1.0 – Production on 星期一 5月 21 18:16:20 2012
Copyright (c) 198
简单排序:归并排序
dieslrae
归并排序
public void mergeSort(int[] array){
int temp = array.length/2;
if(temp == 0){
return;
}
int[] a = new int[temp];
int
C语言中字符串的\0和空格
dcj3sjt126com
c
\0 为字符串结束符,比如说:
abcd (空格)cdefg;
存入数组时,空格作为一个字符占有一个字节的空间,我们
解决Composer国内速度慢的办法
dcj3sjt126com
Composer
用法:
有两种方式启用本镜像服务:
1 将以下配置信息添加到 Composer 的配置文件 config.json 中(系统全局配置)。见“例1”
2 将以下配置信息添加到你的项目的 composer.json 文件中(针对单个项目配置)。见“例2”
为了避免安装包的时候都要执行两次查询,切记要添加禁用 packagist 的设置,如下 1 2 3 4 5
高效可伸缩的结果缓存
shuizhaosi888
高效可伸缩的结果缓存
/**
* 要执行的算法,返回结果v
*/
public interface Computable<A, V> {
public V comput(final A arg);
}
/**
* 用于缓存数据
*/
public class Memoizer<A, V> implements Computable<A,
三点定位的算法
haoningabc
c 算法
三点定位,
已知a,b,c三个顶点的x,y坐标
和三个点都z坐标的距离,la,lb,lc
求z点的坐标
原理就是围绕a,b,c 三个点画圆,三个圆焦点的部分就是所求
但是,由于三个点的距离可能不准,不一定会有结果,
所以是三个圆环的焦点,环的宽度开始为0,没有取到则加1
运行
gcc -lm test.c
test.c代码如下
#include "stdi
epoll使用详解
jimmee
c linux 服务端编程 epoll
epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linu
Hibernate对Enum的映射的基本使用方法
linzx0212
enum Hibernate
枚举
/**
* 性别枚举
*/
public enum Gender {
MALE(0), FEMALE(1), OTHER(2);
private Gender(int i) {
this.i = i;
}
private int i;
public int getI
第10章 高级事件(下)
onestopweb
事件
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
孙子兵法
roadrunners
孙子 兵法
始计第一
孙子曰:
兵者,国之大事,死生之地,存亡之道,不可不察也。
故经之以五事,校之以计,而索其情:一曰道,二曰天,三曰地,四曰将,五
曰法。道者,令民于上同意,可与之死,可与之生,而不危也;天者,阴阳、寒暑
、时制也;地者,远近、险易、广狭、死生也;将者,智、信、仁、勇、严也;法
者,曲制、官道、主用也。凡此五者,将莫不闻,知之者胜,不知之者不胜。故校
之以计,而索其情,曰
MySQL双向复制
tomcat_oracle
mysql
本文包括:
主机配置
从机配置
建立主-从复制
建立双向复制
背景
按照以下简单的步骤:
参考一下:
在机器A配置主机(192.168.1.30)
在机器B配置从机(192.168.1.29)
我们可以使用下面的步骤来实现这一点
步骤1:机器A设置主机
在主机中打开配置文件 ,
zoj 3822 Domination(dp)
阿尔萨斯
Mina
题目链接:zoj 3822 Domination
题目大意:给定一个N∗M的棋盘,每次任选一个位置放置一枚棋子,直到每行每列上都至少有一枚棋子,问放置棋子个数的期望。
解题思路:大白书上概率那一张有一道类似的题目,但是因为时间比较久了,还是稍微想了一下。dp[i][j][k]表示i行j列上均有至少一枚棋子,并且消耗k步的概率(k≤i∗j),因为放置在i+1~n上等价与放在i+1行上,同理