Vue2框架
Vue2框架
Vue定义
Vue.js是一种构建用户界面的渐进式框架,提供了MVVM模型数据绑定和一个可组合的组件系统,具有简单灵活的API,采用自底向上逐层应用
Vue安装
/ 浏览器安装Vue Devtools 可以在界面审查金额调试Vue应用/
安装方法:新手推荐用script引用
1.直接用<script>引入---Vue注册为全局变量
开发版本--vue.js文件(包含完整的警告和调试模式)
生产版本--Vue.min.js(删除了警告)
2.NPM安装-构建大型应用推荐使用
npm install vue
3.命令行工具(CLI)--Vue脚手架
为单页面应用(SPA)快速搭建脚手架--具体查看Vue CLI文档
Vue插值
Mustache语法:{{ }}
页面插值:1.`v-text`
2.`{{}}`:绑定文本类型的值或单个表达式
3.`v-once`
4.`v-html`
5.`v-bind`
指令:
1.`v-text`:绑定元素内容
2.`v-once`:只渲染元素或组件一次
3.`v-html`:将数据作为html内容绑定
4.`v-bind`:绑定属性
绑定属性:`<div v-bind:id="myId"></div>` -- myId动态
绑定属性名:`<div bind:[key]="val"></div>` -- key和val动态,vue2.6.0+支持
5.`v-show`:通过css中的display属性显示或隐藏元素
6.`v-if v-else-if v-else`:通过销毁或重建显示或隐藏元素
7.`v-for`:遍历循环
8.`v-on`:绑定事件
9.`v-slot`:插槽
10.`v-cloak`:绑定到元素上只到对应的实例编译完成
11.`v-model`:表单内容绑定
12.`v-pre`:不需要编译
Vue生命周期--钩子函数
创建Vue对象 new Vue()--->
/执行beforeCreate事件钩子 /--->
开始监控Data对象数据变化 --->
Vue内部初始化事件init Events--->
/ 执行created事件钩子(可以执行ajax请求) /--->
判断有无el挂载选项 ---?
无--->当Vm.$mount(el)被调用执行下一步
有--->判断有无模块选项---?
无--->编译外部HTML作为模块
有--->执行模块渲染函数
--->
/ 开始执行beforeMount事件钩子/--->
将模块编译好的html内容替换el挂载指向的DOM对象或标签内容--->
/ 开始执行mounted事件钩子(此时挂载完成)/--->
进入Mounted监控数据变换实时更新DOM---<
--[当data数据改变]--->
/执行beforeUpdate事件钩子 /--->
--[虚拟DOM重新渲染页面]--->
/执行Updated事件钩子/ --->
>---->
当vm.$destriy()被调用--->
/开始执行beforeDestory事件钩子 /--->
销毁监控,子模块和事件监听--->
Destroyed--->
/ 开始执行destroyed事件钩子/
Vue条件与循环
#条件:
(1)v-if控制切换一个元素是否显示(根据v-for后面的表达式是否为true或false显示内容)
eg:
<div id="app-3">
<p v-if="seen">现在你看到我了</p>
</div>
var app3 = new Vue({
el: '#app-3',
data: {
seen: true
}
})
(2)v-else 是v-if的语句块,当v-if为false显示的内容,不需要表达式,但前面必须出现v-if或v-else-if
eg:
<div v-if="Math.random() > 0.5">Now you see me</div>
<div v-else> Now you don't </div>
(3)v-show是根据表达式之真假值,切换元素的 CSS中display属性
#注意 v-if和v-show的区别
v-show是通过元素的display属性控制内容显示与隐藏,而v-if是销毁或重建元素控制内容显示,而且v-show用于切换频繁时使用
#循环
v-for基于源数据多次渲染元素或模板块,渲染的参数可以是:Array | Object | number | string | Iterable
语法:v-for="(item,[index,key] in list"
参数:
eg: <div v-for="(item, index) in items"></div>
<div v-for="(item,index) in array"></div>---值,下标
<div v-for="(val, name, index) in object"></div>---值,名,索引
#注意 v-for 的默认行为会尝试原地修改元素而不是移动它们,要强制其重新排序元素,你需要用特殊 attribute key 来提供一个排序提示
eg:<div v-for="item in items" :key="item.id">
{{ item.text }}
</div>
Vue事件绑定
v-on指令---简写@
用法:在元素绑定事件:<div v-on:click="fun()"></div>
//<div @click="fun()"></div>
fun()应该在Vue实例的methods中进行定义
绑定动态事件:<div v-on:[event]="fun()"></div>
v-on修饰符:
.stop---阻止事件冒泡 eg: <a v-on:click.stop="doThis"></a>
.prevent---阻止事件默认行为 eg:<form v-on:submit.prevent="onSubmit"></form>
.capture---添加事件侦听器时使用 capture 模式
.self---只当事件是从侦听器绑定的元素本身触发时才触发回调。
.once---只触发一次回调
.passive---(2.3.0) 以 { passive: true } 模式添加侦听器
.{keyCode | keyAlias} - ---只当事件是从特定键触发时才触发回调
Vue Class与Style绑定
`v-bind`绑定样式 简写为`:`
#绑定class
1.以对象的形式绑定class:<h1 v-bind:class="{active:isActive}">
active就是类名,isActive是一个布尔值,表示active是否生效
2.以数组的形式绑定class:<h1 :class="[a,b]">
a和b是data中的数据,也可以直接写类的名字
也可以在数组中使用三元运算符:<h1 :class="[isActive ? 'active' : '']">
#绑定style
1.以对象的形式绑定:<h1 :style="{color:'blue',fontSize:font+'px'}"> -- 属性名就是样式名,font是data中的变量
<h1 :style="styleObj"> -- styleObj是一个样式对象
2.以数组的形式绑定:<h1 :style="[styleObj,styleObj2]">-本质绑定多个样式对象
Vue表单绑定
v-model指令:只用于<input><select><textarea>标签和components模块
在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步
v-mode修饰符:
.lazy--->为在事件结束之后进行同步,不实时更新
eg:<input v-model.lazy="msg">
.number--->自动将用户的输入值转为数值类型
eg:<input v-model.number="age" type="number">
.trim--->自动过滤用户输入的首尾空白字符
Vue基础组件
组件注意规范:
# (1) 组件的data必须是一个函数,该函数返回一个对象----由于数据对象都指向同一个data对象,当在一个组件中修改data时,其他重用的组件中的data会同时被修改;而使用返回对象的函数,由于每次返回的都是一个新对象(Object的实例),引用地址不同,则不会出现这个问题
# (2)组件名:1.短横线分隔法:`my-component` 2.大驼峰命名法:`MyComponent` -- 在调用时,直接在DOM中无效,需要使用短横线分隔法调用,可以在template中使用
# (3)组件中的模板只能有一个根元素,需要用一个标签包含模块内容
全局组件
<div id="components-demo">
<button-counter></button-counter>
</div>
// 定义一个名为 button-counter 的新组件
Vue.component('button-counter', {
data: function () {
return {
count: 0
}
},
template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
})
局部组件
用于实例中创建
let component = {
template:"",
data:function(){
return {
msg:"Hello"
}
}...
}
父子组件
第一种:props+$emit()
第二种:回调函数
第三种:$parent+$children
第四种:provide+inject
第五种:$attrs+$listeners
第六种:ref+$refs
组件传值
`父传子--prop`
1.传静态值
<child-component msg="Hello"></child-component> -- 父
props:["msg"],
调用:同data中的值一样 -- 子
2.传动态值
<child-component v-bind:mg="msg"></child-component>
-- msg就是父组件中一个动态值
注意:1.如果要传递一个具体的数字值,那么要使用v-bind形式,否则会被当成字符串传递
2.如果要传递一个具体的值,并希望值的类型不被改变,那么就要使用v-bind形式,或者使用动态传值的形式
`子传父:子触发事件,父监听事件`
单向数据流:父子prop之间是单向下行绑定
1.子触发事件:vm.$emit("事件名"[,args...])
2.父监听事件:v-on:事件名="事件处理函数" -- args会作为回调函数的参数被父接收
`兄弟传值:父传子,子传父`
Vue过滤器filter
定义和调用
`定义`
//全局过滤器
Vue.filter("过滤器名",function(data[,args...]){
//code
return 格式化之后的文本;
})
//局部过滤器,vue实例的filters选项
filters:{
filterName(data){
//code
}
}
`调用`
//1.在{{}}使用
{{val | filterName}} -- 只有一个过滤器,并且没有第二个参数
{{val | filterName1 | filterName2}} -- 有多个过滤器
{{val | filterName(arg1,arg2...)}} -- 过滤器有参数
//2.在v-bind中使用
<div :attrName="val | filterName"></div>
Vue插槽slot
定义:将元素作为承载分发内容的出口
Vue计算属性computed
Vue混入
混入基础
混入(mixin):混入可用包含任意组件选项,当混入对象被组件使用时,所有混入对象的选项都将被混合到改组件中的选项
eg:
//定义一个混入对象
var Mymixin ={
created:function(){
this.hello()
},
methods:{
hello(){
console.log(888)
}
}
}
//定义一个使用混入对象的组件
var component=vue.extend({
mixins:[Mymixin]
})
var component =new Component();//888
选项合并
`混入组件选项属性同名时,数据对象在内部会递归合并,当发生冲突时会以组件数据优先,同名的钩子函数将合并为一个数组,混入对象的钩子将在组件自身钩子之前被调用`
全局混入
混入可用在全局注册中,当会影响每一个之后被创建的Vue实例
Vue操作DOM
1.给DOM绑定vue变量,然后通过改变vue变量的值,来操作DOM
2.给DOM或组件绑定ref属性,然后在实例中可以通过vm.$refs获取到对应的属性,这个属性会指向DOM或者组件
3.可以通过JQ操作DOM:npm i jq -S
import $ from "jq"
4.直接写原生JS
Vue特殊属性
(1)key 主要用在Vue的虚拟DOM算法,key会重新排列元素顺序,有相同的父元素的子元素必须有独特的key,重复的key会造成渲染错误,经常与v-for结合使用
<ul>
<li v-for="item in items" :key="item.id">...</li>
</ul>
(2)ref 用来给元素或子组件注册引用信息,引用信息将会注册在父组件的$refs对象上,用在普通的DOM对象,引用指向DOM元素,用在子组件上,引用就指向组件实例
<p ref="p">hello</p>---DOM
<child-component ref="child"></child-component>---子组件
Vue内置的组件
(1)component
(2)keep-alive
缓存组件的内容,组件内容比较简单可以用v-show实现,复杂的用keep-alive
(3)slot
Vue的hash和history模式
hash模式的改变方法
第一种:
window.onhashchange事件,事件对象中的location.hash获取到当前hash路径,在页面标志的url中有"#"号
第二种:
手动更改在网页url路径中加'#',浏览器中前进后退按钮
第三种:
location.href中连接地址加上'#'
history模式的改变方法
第一种:
history.pushState()事件切换url路径
Vue路由
Vue路由安装
第一种:#直接下载 / CDN
https://unpkg.com/vue-router/dist/vue-router.js(opens new window)
<script src="/path/to/vue.js"></script>
<script src="/path/to/vue-router.js"></script>
第二种:#NPM
npm install vue-router
如果在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装路由功能:
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
如果使用全局的 script 标签,则无须如此 (手动安装)。
第三种:#Vue CLI
如果你有一个正在使用 Vue CLI (opens new window)的项目,你可以以项目插件的形式添加 Vue Router。CLI 可以生成上述代码及两个示例路由。它也会覆盖你的 App.vue,因此请确保在项目中运行以下命令之前备份这个文件:vue add router
Vue路由基本配置
配置:
<!--引入vue.js-->
<script src="vue.js"></script>
<!--引入Vue-router.js-->
<script src="vue-router.js></script>
DOM样式中
<!--使用router-link组件导航 to直接指定链接-->
<div id='app'>
<router-link to='/foo'>go to foo</router-link>
<router-link to='/foo'>go to foo</router-link>
<!--将路由匹配组件渲染-->
<router-view><router-view>
</div>
js中
<!--定义路由组件-->
let Foo={template:'<div>foo</div>'},
let Bar={templte:'<div>bar</div>'}
<!--创建router实例,配制routes属性-->
const router =new VueRouter({
routes:[
{path:'/foo',component:FOO},
{path:'/bar',component:bar},
.......
]//可缩写routes
})
<!--创建和挂载根实例-->
const app=new Vue({
el:'#app',//或通过app.$mount('#app')挂载
router:router,//第二个为router实例名
})
基础路由
第一步:定义路由组件(可用import导入进来)
const foo={template:`<div>foo</div>`}
第二步:定义路由
const routes={
path:'/foo',//路由渲染的路径--to
component:foo,//这个foo为路由组件名
props:[],
children:[],
.....
}
第三步:创建路由实例,配置路由参数
const router=new VueRouter({
routes:routes,//第二个routes为路由名
})
第四步:创建和挂载根实例
const app=new Vue({
el:'#app'
router:router,//第二个为路由实例名
})
编程式导航
router.push()方法:会向history栈添加一个新记录,当浏览器点后退按钮时,会回到之前的URL
动态路由
动态路由传参
传参模式:
第一种:路径参数使用`:`
1.router对象的path中:
path:"user/:uid/:uname" -- 表示有两个路径参数,一个为uid,一个为uname
2.URL:user/1/yss -- uid=1&uname=yss
3.获取:路径参数默认保存在:this.$route.params中
4.页面中获取参数:{{$route.params.uid}}
注意:实例属性方法在实例中,通过this调用;在实例外,通过实例名调用;在模板中,则是直接调用
第二种:路由组件传参
将路径参数由$route获取变为props获取
1.router对象的配置中,添加props属性
{
path:"user/:uid",
component:User,
props:true
}
2.组件中,设置props属性
export default {
props:["uid"]
}
3.模板中获取参数:{{uid}}
导航守卫
全局守卫--路径拦截
局部守卫
beforeRouteEnter(to,from,next)
路由懒加载
好处:1.缩短路由渲染的时间,网页只需要加载对应的js文件
Vue文件的懒加载
eg:router/index.js
const routes=[
{...},{...},
{path:'/hhh',name:hhh,
component:()=>{
import('../views/Home.Vue')
}
}
]
Vue cli
目录结构
build目录:webpack相关配置目录
config目录:项目配置目录
--index.js --项目相关设置
--dev:开发环境相关设置
--build:生产环境相关设置
node_modules目录:项目依赖第三方包--源代码中一般不包含,通过npm install命令安装
src目录:源文件目录
--assets目录:静态资源目录--文件会被压缩
--components目录:组件目录
--router目录:路由目录
--index.js文件:导出路由对象--路由相关设置
--App.vue文件:根组件
>template 组件
>sctript js
>style css样式 --scoped 表示只在当前组件中生效
--main.js文件:根实例所在文件
static目录:项目使用的静态资源
--.babelrc:转码器配置文件
--.deitorconfig:编辑器配置文件
--.gitignore:git会忽略的文件
--.postcssrc.js:兼容所有浏览器的兼容写法
--index.html:入口文件
--package.json:项目设置
--package-lock.json:记录包的来源与版本
安装依赖
一:Sass文件
安装scss
npm install node-sass -D
npm install sass-loader -D
安装不成功,错误排除原因
-->1.使用国内镜像
2.更改电脑计算机用户的.npmrc文件添加如下内容
phantomjs_cdnurl=http://cnpmjs.org/downloads
sass_binary_site=https://npm.taobao.org/mirr
registry
如果编译不成功,排除是否是版本问题:
建议sass-loader安装7.3.1的版本
npm install sass-loader@7.3.1 -D
npm install node-sass@4.14.1 -D
二:ElementUI
安装:基于Vue2.0的桌面端端口
跨域请求与预检请求
/跨域/
1.服务器端允许跨域
node.js中设置header:
res.header("Access-Control-Allow-Origin", "*");
//添加content-type,解决跨域请求头content-type类型不符
res.header("Access-Control-Allow-Headers", "content-type,X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",' 3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");
2.服务端不允许跨域,通过本地代理实现
在本地设置服务器,通过本地的服务器请求跨域资源,这样就将跨域的服务器资源变成了本地资源,然后请求本地资源
vue-cli:config/index.js
dev:{
proxyTable:{
"/api":{
target:"http://域名:端口号/",
changeOrigin:true,
pathRewrite:{
"^/api":""
}
}
}
}
/预检/
1.当请求不是简单请求时就是预检请求
2.表现形式:一个ajax请求会发送两次,但是一次是preflight,从后台来看请求类型是OPTIONS
3.简单请求:满足三个条件
1.请求类型只能是:GET,POST,HEAD
2.请求头的content-type只能是:text/plain,application/x-www-form-urlencoded(表单默认数据编码格式),multipart/form-data(表单上传文件时需要的编码格式)
3.请求时没有自定义的Head
VueX
vuex概述
(一)定义:VueX是实现组件全局状态(数据)管理的机制,可以方便的实现组件之间数据共享
特点:1.能够在Vuex中集中管理共享数据,易于开发和维护
2.存储在Vuex的数据是响应式的,能够实时保持数据与页面的同步
3.能够高效实现组件之间的数 据共享
Vuex的基本使用
1.安装:1.使用<script>标签引入
2.npm install vuex -S
2.将需要共享的状态(state)保存到仓库(store)中
store.js:
import Vue from "vue"
import Vuex from "vuex"
Vue.use(Vuex)
const store = new Vuex.Store({
state:{ //共享的状态(数据)
msg:""
},
mutations:{
//在组件中更改store状态的方法,state作为第一个参数,data是传递的参数
changeMsg(state,data){
state.msg = data;
}
}
})
export default store
3.在根组件上应用vuex,实现在所有的组件中都可以访问store
main.js:
import store from "./store.js"
new Vue({
...
store:store //通过store选项将状态挂载
})
4.组件中访问:1.this.$store.state.msg -- 实例中访问
2.$store.state.msg -- 模板中访问
3.this.$store.commit("changeMsg","test")
-- 组件中更新store的值
4.computed:{ //通过计算属性监听msg变化
msg(){
return this.$store.state.msg;
}
}
5.watch:{
msg(newVal){
//监听store中的值
}
}
Vue2框架的更多相关文章
- Vue2 框架开发的单页程序页面首次加载慢的原因与优化方案
在用Vue2 框架进行单页面开发时,开发完成后项目打包到线上环境,发现vendor脚本有963K,app.css文件也有四百多k,用户第一次打开网页加载这两个文件要十多秒,会使页面白屏十多秒,之后再次 ...
- vue2项目结构搭建
vue2项目结构初搭建与项目基本流程 一.开始项目结构搭建的重要性 决定项目是否能够健康成长 决定了项目是否利于多人协作开发 决定了项目是否利于后期维护 决定了项目是否性能良好 决定了代码是否重用率降 ...
- Vue3.0新特性
Vue3.0新特性 Vue3.0的设计目标可以概括为体积更小.速度更快.加强TypeScript支持.加强API设计一致性.提高自身可维护性.开放更多底层功能. 描述 从Vue2到Vue3在一些比较重 ...
- Thinkphp5.0+Vue2.0前后端分离框架Vuethink
VueThink是一套基于Vue全家桶(Vue2.x + Vue-router2.x + Vuex)+ Thinkphp的前后端分离框架. 脚手架构建也可以通过vue官方的vue-cli脚手架工具构建 ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十二 || 三种跨域方式比较,DTOs(数据传输对象)初探
更新反馈 1.博友@落幕残情童鞋说到了,Nginx反向代理实现跨域,因为我目前还没有使用到,给忽略了,这次记录下,为下次补充.此坑已填 2.提示:跨域的姊妹篇——<三十三║ ⅖ 种方法实现完美跨 ...
- webpack4+vue2+axios+vue-router的多页+单页混合应用框架
VUE2的单页应用框架有人分享了,多页应用框架也有人分享了,这里就分享一个单页和多页的混合应用框架吧,初现雏形,还有很多需要优化和改善的地方... 结尾有github地址. 项目结构 │ ├─buil ...
- vue 专题 vue2.0各大前端移动端ui框架组件展示
Vue 专题 一个数据驱动的组件,为现代化的 Web 界面而生.具有可扩展的数据绑定机制,原生对象即模型,简洁明了的 API 组件化 UI 构建 多个轻量库搭配使用 请访问链接: https://ww ...
- Vue2.0 中,“渐进式框架”和“自底向上增量开发的设计”这两个概念是什么?(转)
https://www.zhihu.com/question/51907207?rf=55052497 徐飞 在我看来,渐进式代表的含义是:主张最少. 每个框架都不可避免会有自己的一些特点,从而会对使 ...
- vite搭建一个vue2的框架
01-创建一个基础的模板框架 npm init vite@latest 02-安装依赖 npm install npm install vue@2.x vue-template-compiler@2 ...
随机推荐
- 【译】感谢 Flash 所做的一切
翻译:疯狂的技术宅来源:Chromium Blog原文标题:So long, and thanks for all the Flash英文原文:https://blog.chromium.org/20 ...
- hive从入门到放弃(四)——分区与分桶
今天讲讲分区表和分桶表,前面的文章还没看的可以点击链接: hive从入门到放弃(一)--初识hive hive从入门到放弃(二)--DDL数据定义 hive从入门到放弃(三)--DML数据操作 分区 ...
- C#内置委托类型Func和Action对比及用法
C#的内置委托类型 Func Action 返回值 有(只有一个Tresult) 无 重载 17个(0参-16参) 17个(0参-16参) 泛型 支持 支持 系统内置 是 是 是否需要声明 否 否 c ...
- 针对form表单赋值封装
1 (function ($){ 2 $.fn.extend({ 3 exajax:function(url,opts,convert){ 4 var ajaxParam = { 5 url:url, ...
- CVE-2022-22947 SpringCloud GateWay SpEL RCE
CVE-2022-22947 SpringCloud GateWay SpEL RCE 目录 CVE-2022-22947 SpringCloud GateWay SpEL RCE 写在前面 环境准备 ...
- LC-242
利用ASCII码构成哈希表来映射 和这题类似: https://leetcode-cn.com/problems/minimum-window-substring/solution/li-yong-a ...
- IDEA小技巧:Debug拖动跳转任意行
昨天分享了一个在IDEA中为Debug断点添加条件的小技巧.今天继续分享一个Debug过程中非常实用的小插件. 插件名字叫Jump To Line: 安装完成之后,你在Debug过程中,会在断点的左边 ...
- 可怕!CPU暗藏了这些未公开的指令!
大家好,我是轩辕. 我们知道,我们平时编程写的高级语言,是经过编译器编译以后,变成了CPU可以执行的机器指令: 而CPU能支持的指令,都在它的指令集里面了. 很久以来,我都在思考一个问题: CPU有没 ...
- windodws pyusb hub端口对应连接的usb设备
源码: 1 #!/usr/bin/python 2 import sys 3 import usb.core 4 # find USB devices 5 dev = usb.core.find(fi ...
- 通过代码解释什么是API,什么是SDK?
这个问题说来惭愧,读书时找实习面的第一家公司,问的第一个问题就是这个. 当时我没能说清楚,回去之后就上百度查.结果查了很久还是看不懂,然后就把这个问题搁置了. 谁知道毕业正式工作后,又再一次地面对了这 ...