您的位置:

经典aspvue.js(经典老歌100首怀旧连播)

经典aspvue.js(经典老歌100首怀旧连播)

更新:

本文目录一览:

Web前端主流框架—Vue的优缺点分析

Vue:

Vue是尤雨溪编写的一个构建数据驱动的Web界面的库,准确来说不是一个框架,它聚焦在V(view)视图层。它有以下的特性:1.轻量级的框架;2.双向数据绑定;3.指令;4.插件化。

优点:

1.简单:官方文档很清晰,比Angular简单易学。

2.快速:异步批处理方式更新DOM。

3.组合:用解耦的、可复用的组件组合你的应用程序。

4.紧凑:~18kbmin+gzip,且无依赖。

5.强大:表达式无需声明依赖的可推导属性(computedproperties)。

6.对模块友好:可以通过NPM、Bower或Duo安装,不强迫你所有的代码都遵循Angular的各种规定,使用场景更加灵活。

缺点:

1.新生儿:Vue.js是一个新的项目,没有angular那么成熟。

2.影响度不是很大:google了一下,有关于Vue.js多样性或者说丰富性少于其他一些有名的库

3.不支持IE8。

以上就是青藤小编关于Web前端主流框架:Vue的优缺点分析的相关分享,希望对大家有所帮助,想要了解更多相关内容,欢迎大家及时关注哦!

号称目前最火的前端框架Vue,它有什么显著特点呢?

1、Vue是什么

Vue.js 是目前最火的一个前端框架,除了可以开发网站,还可以开发手机App。

Vue.js 是前端的主流框架之一,和Angular.js、React.js 一起,并成为前端三大主流框架。

Vue.js 是一套构建用户界面的框架,只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合。

Vue.js 是一套用于构建用户界面的渐进式框架。

2、Vue的特点

遵循 MVVM 模式

编码简洁,体积小,运行效率高,适合移动/PC 端开发

它本身只关注 UI, 可以轻松引入 vue 插件或其它第三库开发项目

3、Vue与其他前端框架的关系

借鉴 angular 的模板和数据绑定技术

借鉴 react 的组件化和虚拟 DOM 技术

4、Vue的现有插件

vue-cli: vue 脚手架,用于搭建项目的骨架

vue-resource(axios): ajax 请求

vue-router: 路由

vuex: 状态管理

vue-lazyload: 图片懒加载

vue-scroller: 页面滑动相关

mint-ui: 基于 vue 的 UI 组件库(移动端)

element-ui: 基于 vue 的 UI 组件库(PC 端)

5、学习Vue的思想改变

Vue的中心思想是数据驱动,像远古时代的老前辈jQuery是结构驱动。

大家回忆下以前我们使用jQuery写代码的时候,经常是这样写的:

$("#myDiv").html("HelloWorld");

这些写法首先要获取Dom节点,也就是Dom结构,然后再修改数据更新结构的内容,使用jQuery的一个很大的目的就是为了去简化Dom的操作,而使用Vue就大不一样了,Vue的做法就是直接this.msg=HelloWorld,然后msg就会自动的同步到结构上,我们所要关心的是数据内容的改变,而不再去关心如何操作Dom结构了。

总结一句话:不要在想着怎么操作DOM,而是想着如何操作数据!!

vue实现路由跳转的原理是什么,是调用js底层什么方法

前端路由是直接找到与地址匹配的一个组件或对象并将其渲染出来。改变浏览器地址而不向服务器发出请求有两种方式:

1. 在地址中加入#以欺骗浏览器,地址的改变是由于正在进行页内导航

2. 使用H5的window.history功能,使用URL的Hash来模拟一个完整的URL。

当打包构建应用时,Javascript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。

目录结构

先来看看整体的目录结构

和流程相关的主要需要关注点的就是 components、history 目录以及 create-matcher.js、create-route-map.js、index.js、install.js。下面就从 basic 应用入口开始来分析 vue-router 的整个流程。

import Vue from 'vue'

import VueRouter from 'vue-router'

// 1. 插件

// 安装 router-view and router-link 组件

// 且给当前应用下所有的组件都注入 $router and $route 对象

Vue.use(VueRouter)

// 2. 定义各个路由下使用的组件,简称路由组件

const Home = { template: 'divhome/div' }

const Foo = { template: 'divfoo/div' }

const Bar = { template: 'divbar/div' }

// 3. 创建 VueRouter 实例 router

const router = new VueRouter({

mode: 'history',

base: __dirname,

routes: [

{ path: '/', component: Home },

{ path: '/foo', component: Foo },

{ path: '/bar', component: Bar }

]

})

// 4. 创建 启动应用

// 一定要确认注入了 router

// 在 router-view 中将会渲染路由组件

new Vue({

router,

template: ` div id="app"

h1Basic/h1

ul

lirouter-link to="/"//router-link/li

lirouter-link to="/foo"/foo/router-link/li

lirouter-link to="/bar"/bar/router-link/li

router-link tag="li" to="/bar"/bar/router-link

/ul

router-view class="view"/router-view

/div

`

}).$mount('#app')123456789101112131415161718192021222324252627282930313233343536373839404142

作为插件

上边代码中关键的第 1 步,利用 Vue.js 提供的插件机制 .use(plugin) 来安装 VueRouter,而这个插件机制则会调用该 plugin 对象的 install 方法(当然如果该 plugin 没有该方法的话会把 plugin 自身作为函数来调用);下边来看下 vue-router 这个插件具体的实现部分。

VueRouter 对象是在 src/index.js 中暴露出来的,这个对象有一个静态的 install 方法:

/* @flow */

// 导入 install 模块

import { install } from './install'// ...import { inBrowser, supportsHistory } from './util/dom'// ...export default class VueRouter {

// ...}

// 赋值 install

VueRouter.install = install

// 自动使用插件if (inBrowser window.Vue) {

window.Vue.use(VueRouter)

}123456789101112131415161718

可以看到这是一个 Vue.js 插件的经典写法,给插件对象增加 install 方法用来安装插件具体逻辑,同时在最后判断下如果是在浏览器环境且存在 window.Vue 的话就会自动使用插件。

install 在这里是一个单独的模块,继续来看同级下的 src/install.js 的主要逻辑:

// router-view router-link 组件import View from './components/view'import Link from './components/link'// export 一个 Vue 引用export let _Vue// 安装函数export function install (Vue) {

if (install.installed) return

install.installed = true

// 赋值私有 Vue 引用

_Vue = Vue // 注入 $router $route

Object.defineProperty(Vue.prototype, '$router', {

get () { return this.$root._router }

}) Object.defineProperty(Vue.prototype, '$route', {

get () { return this.$root._route }

}) // beforeCreate mixin

Vue.mixin({

beforeCreate () { // 判断是否有 router

if (this.$options.router) { // 赋值 _router

this._router = this.$options.router // 初始化 init

this._router.init(this) // 定义响应式的 _route 对象

Vue.util.defineReactive(this, '_route', this._router.history.current)

}

}

}) // 注册组件

Vue.component('router-view', View)

Vue.component('router-link', Link)// ...}12345678910111213141516171819202122232425262728293031323334353637383940414243

这里就会有一些疑问了?

· 为啥要 export 一个 Vue 引用?

插件在打包的时候是肯定不希望把 vue 作为一个依赖包打进去的,但是呢又希望使用 Vue 对象本身的一些方法,此时就可以采用上边类似的做法,在 install 的时候把这个变量赋值 Vue ,这样就可以在其他地方使用 Vue 的一些方法而不必引入 vue 依赖包(前提是保证 install 后才会使用)。

· 通过给 Vue.prototype 定义 $router、$route 属性就可以把他们注入到所有组件中吗?

在 Vue.js 中所有的组件都是被扩展的 Vue 实例,也就意味着所有的组件都可以访问到这个实例原型上定义的属性。

beforeCreate mixin 这个在后边创建 Vue 实例的时候再细说。

实例化 VueRouter

在入口文件中,首先要实例化一个 VueRouter ,然后将其传入 Vue 实例的 options 中。现在继续来看在 src/index.js 中暴露出来的 VueRouter 类:

// ...import { createMatcher } from './create-matcher'// ...export default class VueRouter {

// ...

constructor (options: RouterOptions = {}) {

this.app = null

this.options = options

this.beforeHooks = []

this.afterHooks = []

// 创建 match 匹配函数

this.match = createMatcher(options.routes || [])

// 根据 mode 实例化具体的 History

let mode = options.mode || 'hash'

this.fallback = mode === 'history' !supportsHistory if (this.fallback) {

mode = 'hash'

} if (!inBrowser) {

mode = 'abstract'

}

this.mode = mode switch (mode) {

case 'history':

this.history = new HTML5History(this, options.base) break

case 'hash':

this.history = new HashHistory(this, options.base, this.fallback) break

case 'abstract':

this.history = new AbstractHistory(this) break

default:

assert(false, `invalid mode: ${mode}`)

}

}

// ...}123456789101112131415161718192021222324252627282930313233343536373839

里边包含了重要的一步:创建 match 匹配函数。

match 匹配函数

匹配函数是由 src/create-matcher.js 中的 createMatcher 创建的:

/* @flow */

import Regexp from 'path-to-regexp'// ...import { createRouteMap } from './create-route-map'// ...export function createMatcher (routes: ArrayRouteConfig): Matcher {

// 创建路由 map

const { pathMap, nameMap } = createRouteMap(routes)

// 匹配函数 function match (

raw: RawLocation,

currentRoute?: Route,

redirectedFrom?: Location

): Route {

// ...

} function redirect (

record: RouteRecord,

location: Location

): Route {

// ...

} function alias (

record: RouteRecord,

location: Location,

matchAs: string

): Route {

// ...

} function _createRoute (

record: ?RouteRecord,

location: Location,

redirectedFrom?: Location

): Route { if (record record.redirect) { return redirect(record, redirectedFrom || location)

} if (record record.matchAs) { return alias(record, location, record.matchAs)

} return createRoute(record, location, redirectedFrom)

}

// 返回 return match

}

// ...123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051

具体逻辑后续再具体分析,现在只需要理解为根据传入的 routes 配置生成对应的路由 map,然后直接返回了 match 匹配函数。

继续来看 src/create-route-map.js 中的 createRouteMap 函数:

/* @flow */import { assert, warn } from './util/warn'import { cleanPath } from './util/path'// 创建路由 mapexport function createRouteMap (routes: ArrayRouteConfig): {

pathMap: DictionaryRouteRecord,

nameMap: DictionaryRouteRecord

} { // path 路由 map

const pathMap: DictionaryRouteRecord = Object.create(null) // name 路由 map

const nameMap: DictionaryRouteRecord = Object.create(null) // 遍历路由配置对象 增加 路由记录

routes.forEach(route = {

addRouteRecord(pathMap, nameMap, route)

}) return {

pathMap,

nameMap

}

}// 增加 路由记录 函数function addRouteRecord (

pathMap: DictionaryRouteRecord,

nameMap: DictionaryRouteRecord,

route: RouteConfig,

parent?: RouteRecord,

matchAs?: string

) {

// 获取 path 、name

const { path, name } = route

assert(path != null, `"path" is required in a route configuration.`) // 路由记录 对象

const record: RouteRecord = {

path: normalizePath(path, parent),

components: route.components || { default: route.component },

instances: {},

name, parent,

matchAs,

redirect: route.redirect,

beforeEnter: route.beforeEnter,

meta: route.meta || {}

} // 嵌套子路由 则递归增加 记录

if (route.children) {// ...

route.children.forEach(child = {

addRouteRecord(pathMap, nameMap, child, record)

})

} // 处理别名 alias 逻辑 增加对应的 记录

if (route.alias !== undefined) { if (Array.isArray(route.alias)) {

route.alias.forEach(alias = {

addRouteRecord(pathMap, nameMap, { path: alias }, parent, record.path)

})

} else {

addRouteRecord(pathMap, nameMap, { path: route.alias }, parent, record.path)

}

} // 更新 path map

pathMap[record.path] = record // 更新 name map

if (name) { if (!nameMap[name]) {

nameMap[name] = record

} else {

warn(false, `Duplicate named routes definition: { name: "${name}", path: "${record.path}" }`)

}

}

}function normalizePath (path: string, parent?: RouteRecord): string {

path = path.replace(/\/$/, '') if (path[0] === '/') return path if (parent == null) return path return cleanPath(`${parent.path}/${path}`)

}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283

可以看出主要做的事情就是根据用户路由配置对象生成普通的根据 path 来对应的路由记录以及根据 name 来对应的路由记录的 map,方便后续匹配对应。

实例化 History

这也是很重要的一步,所有的 History 类都是在 src/history/ 目录下,现在呢不需要关心具体的每种 History 的具体实现上差异,只需要知道他们都是继承自 src/history/base.js 中的 History 类的:

/* @flow */// ...import { inBrowser } from '../util/dom'import { runQueue } from '../util/async'import { START, isSameRoute } from '../util/route'// 这里从之前分析过的 install.js 中 export _Vueimport { _Vue } from '../install'export class History {// ...

constructor (router: VueRouter, base: ?string) { this.router = router this.base = normalizeBase(base) // start with a route object that stands for "nowhere"

this.current = START this.pending = null

}// ...}// 得到 base 值function normalizeBase (base: ?string): string { if (!base) { if (inBrowser) { // respect base tag

const baseEl = document.querySelector('base') base = baseEl ? baseEl.getAttribute('href') : '/'

} else { base = '/'

}

} // make sure there's the starting slash

if (base.charAt(0) !== '/') { base = '/' + base

vuejs在前端开发起到什么作用

jQuery的诸多局限性导致前端工程师的发展受到了很多的限制,只能做一些表面性的工作,并不能实现前后端分离开发。

而近期出现的Vue,它给前端带来了无限的可能和改变。

改变一:真正意义上的前端工程师

之前开发都是前端做静态页面,把页面给到后台程序员改成jsp、php、asp等等...一顿乱改,一顿塞变量,做完以后页面样式乱七八糟,最后你再调整css。说白了你会html,css就行了,基本没什么门槛,可以这么说。

有了Vue和Node的前端工程化以后,前端工程师能做的事情越来越多,后台人员只需要抛过来一个Api,剩下的就可以都交给前端了。

改变二:服务端渲染VS客户端渲染

传统的jsp、php或是模板渲染也好,都是服务端渲染,就是客户端一个请求,服务器直接把整个页面返回给你,简单粗暴。(Spring Boot是通过模板引擎,由服务端完成的渲染工作)

但是vue开发是前后端分离开发,通过api进行交互,客户端请求服务器返回json数据,由客户端进行渲染。

不仅减轻了服务器的压力速度更快而且渲染更加优雅,代码更容易维护。

改变三:渲染优雅,代码易维护

jQuery是通过DOM来控制数据,不仅笨重而且渲染数据特别麻烦,而 Vue是通过数据来控制状态,通过控制数据来控制渲染,变量可以直接写在标签中,渲染更加优雅。

因为前端代码和后台代码都是分开的,所以项目更容易维护,开发效率更高。

改变四:项目工程化,结合npm直接安装第三方库

Vue让前端项目更加工程化,同时也规范了前端工程师的代码,而node和npm的加入才是vue能蓬勃发展的重要原因。

Node为Vue提供了本地server和模块化开发的思路,npm更能安装Vue项目需要的模块,配合Vue使用,比如Moment.js Element ui vuex等等,这些第三方库让Vue有了无限的可能。

敲黑板(补充下):传统开发jQuery是命令式编程,现代框架开发是函数式编程。现代框架开发,可以使用Webpack(当然使用jQuery也可以使用Webpack),可以使用人家提供的现成的脚手架,比方说create-react-app,vue-cli。极大提高了开发的效率,并且可以使用最新的ES6、ES7语法进行开发,在编码体验上,就提高了一个档次。

总结

知其然,知其所以然,没有最好的框架,只有最合适的框架!

经典aspvue.js(经典老歌100首怀旧连播)

本文目录一览: 1、Web前端主流框架—Vue的优缺点分析 2、号称目前最火的前端框架Vue,它有什么显著特点呢? 3、vue实现路由跳转的原理是什么,是调用js底层什么方法 4、vuejs在前端开发

2023-12-08
老男孩主题曲:一首震撼人心的经典

2023-05-18
js经典实例大全,js案例100讲解

本文目录一览: 1、js闭包是什么? 2、js下拉菜单,怎样更简便的实现? 3、js求和小案例 求解 4、JavaScript学习笔记之数组基本操作示例 5、JavaScript实现计算多边形质心的方

2023-12-08
韩国歌曲cjsong(韩国歌曲老歌100首)

本文目录一览: 1、顺子的《Cj》 歌词 2、求《请回答1988》里所有的韩语老歌曲名字! 3、韩剧我的女孩的主题歌的名字是什么 4、韩版花样男子里面的歌曲都是哪些? 顺子的《Cj》 歌词 歌曲名:C

2023-12-08
包含java学习日记day6的词条

2022-11-18
c语言对联100副,医生对联100副欣赏

2022-12-02
java经典,java经典项目

2022-11-29
经典的js代码收藏,完整的js代码

本文目录一览: 1、谁给我帖一段下拉选择菜单的js代码? 2、使用浏览器实现收藏功能js怎么写 3、求三个常用的js代码? 4、求一段简单的JS代码 5、Web前端工程师应该知道的经典代码 谁给我帖一

2023-12-08
java入门经典,java入门经典pdf下载

2023-01-09
java经典编程,java经典编程题书籍

2022-11-27
Python编程题经典100例

2023-05-23
Python入门经典100题

2023-05-23
关于java学习笔记良葛格的信息

2022-11-11
史上最经典java入门基础视频(史上最经典java入门基础视

2022-11-16
c语言经典算法09,c语言经典算法100例pdf

2022-11-23
javascript歌词滚动(歌词滚动怎么实现的)

2022-11-15
java经典算法七题,Java经典算法题

2022-11-22
c语言经典算法50,c语言经典算法老鼠走迷宫

2022-11-25
经典c语言程序100例之八零,c语言基础经典程序100例

2023-01-05
c语言什么书最经典,c语言最经典的书

2023-01-07