Vue详解知识概括

Vue详解知识概括

  • Vue CLI
  • Vue-router
  • Promise
  • Vuex
  • axios
  • Vue开发总结

Vue CLI

什么是Vue CLI:

  • 如果你只是简单写几个Vue的Demo程序, 那么你不需要Vue CLI.
  • 如果你在开发大型项目, 那么你需要, 并且必然需要使用Vue CLI
    ①使用Vue.js开发大型应用时,我们需要考虑代码目录结构、项目结构和部署、热加载、代码单元测试等事情。
    ②如果每个项目都要手动完成这些工作,那无疑效率比较低效,所以通常我们会使用一些脚手架工具来帮助完成这些事情。
  • CLI是什么意思?
    ①CLI是Command-Line Interface, 翻译为命令行界面, 但是俗称脚手架.
    ②Vue CLI是一个官方发布 vue.js 项目脚手架
    ③使用 vue-cli 可以快速搭建Vue开发环境以及对应的webpack配置.

Vue CLI使用前提:

  • 安装NodeJS
    ①默认情况下自动安装Node和NPM
    ②NPM的全称是Node Package Manager
    ③是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。
  • Vue.js官方脚手架工具就使用了webpack模板
    ①对所有的资源会压缩等优化操作
    ②它在开发过程中提供了一套完整的功能,能够使得我们开发过程中变得高效。

Vue CLI的使用:

  • 安装Vue脚手架:npm install -g @vue/cli
    ①查看vue版本:vue --version
    ②注意:上面安装的是Vue CLI3的版本,如果需要想按照Vue CLI2的方式初始化项目时不可以的。
    ③拉取2.X模板(旧版本):npm install -g @vue/cli-init
  • Vue CLI2初始化项目:vue init webpack my-project
  • Vue CLI3初始化项目:vue create my-project

Vue CLI2详解:

  • 初始化命令使用:
    Vue详解知识概括_第1张图片
  • 目录简介:
    ①build.js:构建入口
    ②index.js:变量,配置信息
    ③webpack.base.conf.js:公共webpack配置信息
    ④webpack.dev.conf.js:部署配置信息
    ⑤webpack.prod.conf.js:构建配置信息
    Vue详解知识概括_第2张图片

(运行时+编译器)Runtime-Compiler和(只含有运行时版本)Runtime-only的区别:

  • 如果你需要在客户端编译模板(例如, 向template 选项传入一个字符串,或者需要将模 板中的非DOM的HTML挂载到一个元素),你需要带有编译器的版本,因而需要完整构建版本。
  • 在使用vue-loader或vueify 时,* . vue文件中的模板会在构建时(build time)预编译(pre-compile)为JavaScript.最终生成的bundle中你不再需要编译器(compiler),因此可以直接使用只含有运行时的构建版本(runtime- only)。
//这种情况需要编译器(compiler)
new Vue({
	template: '<div>({ hi }}div>'
)

//这种情况不需要
new Vue({
	render (h) {
		return h('div', this.h1)
	}
})
  • 由于只含有运行时构建版本(runtime-only)比完整构建版本(ull-build)轻量大约30%,你应该尽可能使用只含有运行时的构建版本。如果你还是希望使用完整构建版本,则需要在打包器中配置别名。
  • 简单总结:
    ①如果在之后的开发中,你依然使用template,就需要选择Runtime-Compiler。
    ②如果你之后的开发中,使用的是.vue文件夹开发,那么可以选择Runtime-only。

render和template区别:

//Runtime-Compiler
new Vue({
	el :'#app',
	components: { App },
	template: '<App/>'
})

//Runtime-only
new Vue({
	el : '#app',
	render: h => h(App)
})

  • 为什么存在这样的差异呢?
    ①我们需要先理解Vue应用程序是如何运行起来的。
    ②Vue中的模板如何最终渲染成真实DOM。
    ③我们来看下面的一幅图。
    Vue详解知识概括_第3张图片

npm run build与npm run dev详解:

  • npm run build:
    Vue详解知识概括_第4张图片
  • npm run dev:
    Vue详解知识概括_第5张图片

webpack.base.conf.js起别名:

resolve: {
	extensions: ['.js', '.vue', '.json'],
	alias: {
		'@':resolve('src'),
		'pages': resolve('src/pages'),
		'common': resolve('src/common'),
		'components':resolve('src/components'),
		'network': resolve('src/network')
	}
},

Vue CLI3详解:

  • vue-cli 3 与 2 版本有很大区别:
    ①vue-cli 3 是基于 webpack 4 打造,vue-cli 2 还是 webapck 3
    ②vue-cli 3 的设计原则是“0配置”,移除的配置文件根目录下的,build和config等目录
    ③vue-cli 3 提供了 vue ui 命令,提供了可视化配置,更加人性化
    ④移除了static文件夹,新增了public文件夹,并且index.html移动到public中
  • 初始化使用:
    Vue详解知识概括_第6张图片
  • 目录结构详解:
    Vue详解知识概括_第7张图片
  • 配置去哪里了:
    ①UI方面的配置:启动配置服务器:vue ui
    Vue详解知识概括_第8张图片
    ②一大堆配置文件去哪里了?
    Vue详解知识概括_第9张图片

Vue-router

什么是路由?

  • 路由(routing)就是通过互联的网络把信息从源地址传输到目的地址的活动
  • 路由器提供了两种机制: 路由和转送.
    ①路由是决定数据包从来源到目的地的路径.
    ②转送将输入端的数据转移到合适的输出端.
  • 路由中有一个非常重要的概念叫路由表。路由表本质上就是一个映射表, 决定了数据包的指向。

后端路由阶段:

  • 早期的网站开发整个HTML页面是由服务器来渲染的:
    ①服务器直接生产渲染好对应的HTML页面, 返回给客户端进行展示.
  • 但是一个网站, 这么多页面服务器如何处理呢?
    ①一个页面有自己对应的网址, 也就是URL.
    ②URL会发送到服务器, 服务器会通过正则对该URL进行匹配, 并且最后交给一个Controller进行处理.
    ③Controller进行各种处理, 最终生成HTML或者数据, 返回给前端.
    ④这就完成了一个IO操作.
  • 上面的这种操作, 就是后端路由。
    ①当我们页面中需要请求不同的路径内容时, 交给服务器来进行处理, 服务器渲染好整个页面, 并且将页面返回给客户顿.
    ②这种情况下渲染好的页面, 不需要单独加载任何的js和css, 可以直接交给浏览器展示, 这样也有利于SEO的优化.
  • 后端路由的缺点:
    ①一种情况是整个页面的模块由后端人员来编写和维护的.
    ②另一种情况是前端开发人员如果要开发页面, 需要通过PHP和Java等语言来编写页面代码.
    ③而且通常情况下HTML代码和数据以及对应的逻辑会混在一起, 编写和维护都是非常糟糕的事情.

前端路由阶段:

  • 前后端分离阶段:
    ①随着Ajax的出现, 有了前后端分离的开发模式.
    ②后端只提供API来返回数据, 前端通过Ajax获取数据, 并且可以通过JavaScript将数据渲染到页面中.
    ③这样做最大的优点就是前后端责任的清晰, 后端专注于数据上, 前端专注于交互和可视化上.
    ④并且当移动端(iOS/Android)出现后, 后端不需要进行任何处理, 依然使用之前的一套API即可.
    ⑤目前很多的网站依然采用这种模式开发.
  • 单页面富应用阶段:
    ①其实SPA最主要的特点就是在前后端分离的基础上加了一层前端路由.
    ②也就是前端来维护一套路由规则.
  • 前端路由的核心是什么呢?
    ①改变URL,但是页面不进行整体的刷新。

URL的hash:

  • URL的hash也就是锚点(#), 本质上是改变window.location的href属性.
  • 我们可以通过直接赋值location.hash来改变href, 但是页面不发生刷新
执行:location.hash = '/foo'
返回:"/foo"

执行:location. href
返回:"http: //192.168.1.101: 8000/examples/urlChange/#/foo"

HTML5的history模式:

  • history接口是HTML5新增的, 它有五种模式改变URL而不刷新页面。
  • history接口底层的数据结构是栈。
  • 函数:
    ①history.pushState():插入锚点,改变url,支持前进后退。
    ②history.replaceState():插入锚点,改变url,不支持前进后退。
    ③history.go()
  • 补充说明:
    ①上面只演示了三个方法
    ②因为 history.back() 等价于 history.go(-1)
    ③history.forward() 则等价于 history.go(1)
    ④这三个接口等同于浏览器界面的前进后退
  • 与URL的hash相比,没有了#符号

vue-router认识:

  • 目前前端流行的三大框架, 都有自己的路由实现:
    ①Angular的ngRouter
    ②React的ReactRouter
    ③Vue的vue-router
  • 当然, 我们的重点是vue-router,vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。
  • vue-router是基于路由和组件的:
    ①路由用于设定访问路径, 将路径和组件映射起来.
    ②在vue-router的单页面应用中, 页面的路径的改变就是组件的切换.

安装和使用vue-router:

----创建router文件夹,然后创建index.js文件,创建router实例,配置组件和路径的映射关系:----
import Vue from 'vue'
import VueRouter from 'vue-router'
// 1.注入插件
Vue.use(VueRouter)
// 2.定义路由
const routes = [
	{
		path: '/home',
		component: Home
	}
	{	
		path: '/about', 
		component: About
	}
]

// 3.创建router实例
const router = new VueRouter({
	routes
})
// 4.导出router实例
export default router


----main.js文件中挂载到Vue实例中:----
import Vue  from 'vue'
import App from './App'
import router from './router'
new Vue({
	el: '#app',
	router,
	render: h => h(App)
})


----创建About和Home路由组件----

----使用路由:----
<template>
	<div id="app">
		<h1>我是网站的标题< /h1>
		<router-link to="/home">首页router-link>
		<router-link to="/about">关于router-link>
		<router-view>router-view>
		<h2>我是APP中一些底部版权信息h2>
	div>
template>

----最终效果如下:----
一、当路径是根路径时,router-view没有渲染试图
二、点击首页,路径切换,router-view渲染home组件
伞、点击关于,路径切换,router-view渲染about组件

vue-router细节处理:

  • 路由的默认路径:
    ①默认情况下, 进入网站的首页, 我们希望渲染首页的内容,但是我们的实现中, 默认没有显示首页组件, 必须让用户点击才可以。
    ②如何可以让路径默认跳到到首页, 并且渲染首页组件呢,非常简单, 我们只需要配置多配置一个映射就可以了。
    ③我们在routes中又配置了一个映射,path配置的是根路径: /,redirect是重定向, 也就是我们将根路径重定向到/home的路径下, 这样就可以得到我们想要的结果了。
const routes =[
	{
		path: '/'
		redirect: '/home'
	}
]
  • HTML5的History模式:
    ①我们前面说过改变路径的方式有两种:URL的hash,HTML5的history。默认情况下, 路径的改变使用的URL的hash,如果希望使用HTML5的history模式, 非常简单, 进行如下配置即可:
const router =	new VueRouter({
	routes,
	mode: 'history'
})
const router = new VueRouter({
	routes,
	mode: 'history',
	linkActiveClass:'active'
})
  • 路由代码跳转:
    ①有时候, 页面的跳转可能需要执行对应的JavaScript代码, 这个时候, 就可以使用第二种跳转方式了。
<template>
	<div id="app">
		<h1>我是网站的标题< /h1>
		<button @click="li nkToHomel">首页button>
		<button @click="l inkToAbout">关于button>
		<router-view>router-view>
		<h2>我是APP中一些底部版权信息h2>
	div>
<template>
<script>
	export default{
		name:'App',
		methods: {
			linkToHome() {
				this.$router.push('/home')
			}
			linkToAbout() {
				this.$router.push('/about')
			}
		}
script>

  • 动态路由:
    ①在某些情况下,一个页面的path路径可能是不确定的,比如我们进入用户界面时,希望是如下的路径:/user/aaaa或/user/bbbb。除了有前面的/user之外,后面还跟上了用户的ID。这种path和Component的匹配关系,我们称之为动态路由(也是路由传递数据的一种方式)。
-----路由配置页面---
{
	path: '/user/:id',
	component: User
}

----使用页面----
<div> 
	<h2>{{$route.params.id}}h2> 
div>

----组件页面----
<router-link to="/user/123">用户router-link>

路由懒加载:

  • 官方给出了解释:当打包构建应用时,Javascript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了
  • 官方在说什么呢?首先, 我们知道路由中通常会定义很多不同的页面.这个页面最后被打包在哪里呢? 一般情况下, 是放在一个js文件中.但是, 页面这么多放在一个js文件中, 必然会造成这个页面非常的大.如果我们一次性从服务器请求下来这个页面, 可能需要花费一定的时间, 甚至用户的电脑上还出现了短暂空白的情况.
  • 如何避免这种情况呢? 使用路由懒加载就可以了.路由懒加载做了什么?路由懒加载的主要作用就是将路由对应的组件打包成一个个的js代码块.只有在这个路由被访问到的时候, 才加载对应的组件。
  • 懒加载的方式:
方式一: 结合Vue的异步组件和Webpack的代码分析.
const Home = resolve => { require.ensure(['../components/Home.vue'], () => { resolve(require('../components/Home.vue')) })};

方式二: AMD写法
const About = resolve => require(['../components/About.vue'], resolve);

方式三: 在ES6中, 我们可以有更加简单的写法来组织Vue异步组件和Webpack的代码分割.
const Home = () => import('../components/Home.vue')
//使用懒加载
const routes =[
	{
		path: '/home', component: () => import(' ../components/Home')
	},
		path: '/about', component: () => import('../components/About')
	},
];

路由嵌套:

  • 嵌套路由是一个很常见的功能。比如在home页面中, 我们希望通过/home/news和/home/message访问一些内容。一个路径映射一个组件, 访问这两个路径也会分别渲染两个组件。路径和组件的关系如下:
/home --------> Home
/home/news --------> News
/home/message --------> Message
/about --------> About
  • 实现嵌套路由有两个步骤:
    ①创建对应的子组件, 并且在路由映射中配置对应的子路由。
    ②在组件内部使用标签。
-----一、定义两个组件-----

-----二、配置嵌套路由映射-----
import Vue from 'vue'
import VueRouter from 'vue-router'
const Home = () => import('../components /Home')
const Message = () => import('../components/message')
const News = () => import('../components/news')
const About = ( ) => import('../components/About')
// 1.注入插件
Vue.use (VueRouter)
// 2.定义路由
const routes = [
	{
		path: '/home',
		component: Home,
		children: [
			{
				path: 'message'
				component: Message
			},
			{
				path: 'news',
				component: News
			}
		]
	}
]

-----三、在父组件模板中使用-----
<template>
	<div id="home">
		<h2>我是首页标题h2>
		<router-link to="/home/message">消息router-link>
		<router-link to="/home/news">新闻
		<router-view>router-view>
	div>
template>
  • 嵌套路由也可以配置默认的路径, 配置方式如下:
{
	path: '',
	redirect:'message'
}

路由传递参数:

  • 传递参数主要有两种类型: params和query
  • params的类型:
    ①配置路由格式: /router/:id
    ②传递的方式: 在path后面跟上对应的值
    ③传递后形成的路径: /router/123, /router/abc
  • query的类型:
    ①配置路由格式: /router, 也就是普通配置
    ②传递的方式: 对象中使用query的key作为传递方式
    ③传递后形成的路径: /router?id=123, /router?id=abc
  • 如何使用它们呢? 也有两种方式: 的方式和JavaScript代码方式
----传递参数方式一: <router-link>:----
<router-link 
	:to="{
		path: '/profile/' + 123,
		query: { name:'why',age: 18}
	}"
>档案router-link>

----传递参数方式二: JavaScript代码:----
export default {
	name:'App',
	methods: {
		toProfile() {
			this.$router.push({
				path: '/profile/' + 123,
				query: {name: 'why',age: 18}
			})
		}
	}
}
  • 获取参数:
    ①获取参数通过$route对象获取的,在使用了vue-router 的应用中,路由对象会被注入每个组件中,赋值为 this.$route,并且当路由切换时,路由对象会被更新。
    ②通过$route获取传递的信息如下:
<p>params: {{ $route.params}}p>
<p>query: {{$route.query}}p>
  • $route和$router是有区别的:
    ①$router为VueRouter实例,想要导航到不同URL,则使用$router.push方法
    ②$route为当前router跳转对象里面可以获取name、path、query、params等

路由导航守卫:

  • 我们来考虑一个需求: 在一个SPA应用中, 如何改变网页的标题呢?
    ①网页标题是通过来显示的, 但是SPA只有一个固定的HTML, 切换不同的页面时, 标题并不会改变.<br> ②但是我们可以通过JavaScript来修改<title>的内容.window.document.title = ‘新的标题’.<br> ③那么在Vue项目中, 在哪里修改? 什么时候修改比较合适呢?</li> <li>普通的修改方式:<br> ①我们比较容易想到的修改标题的位置是每一个路由对应的组件.vue文件中.<br> ②通过mounted声明周期函数, 执行对应的代码进行修改即可.<br> ③但是当页面比较多时, 这种方式不容易维护(因为需要在多个页面执行类似的代码).</li> <li>有没有更好的办法呢? 使用导航守卫即可,什么是导航守卫?<br> ①vue-router提供的导航守卫主要用来监听监听路由的进入和离开的.<br> ②vue-router提供了beforeEach和afterEach的钩子函数, 它们会在路由即将改变前和改变后触发.</li> <li>详解:<br> ①我们可以在钩子当中定义一些标题, 可以利用meta来定义。<br> ②导航钩子的三个参数解析:<br> <1>to: 即将要进入的目标的路由对象.<br> <2>from: 当前导航即将要离开的路由对象.<br> <3>next: 调用该方法后, 才能进入下一个钩子</li> </ul> <pre><code class="prism language-xml">// 定义路由 const routes =[ { path:"/home', component: Home, children: [...], meta:{ title:'首页' } }, { path: '/about', component: About, meta: { title:'关于' } }, { path: '/profile/:id', component: Profile , meta: { title:'档案' } } ] //配置路由 const router = new VueRouter ({ routes, mode: 'history', linkActiveClass: 'active', }) router.beforeEach( (to, from, next) => { window.document.title = to.meta.title next() }) </code></pre> <ul> <li>补充:<br> ①如果是后置钩子, 也就是afterEach, 不需要主动调用next()函数.<br> ②上面我们使用的导航守卫, 被称之为全局守卫.<br> <1>路由独享的守卫.<br> <2>组件内的守卫.</li> </ul> <p><strong>路由keep-alive:</strong></p> <ul> <li>keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。它们有两个非常重要的属性:<br> ①include - 字符串或正则表达,只有匹配的组件会被缓存<br> ②exclude - 字符串或正则表达式,任何匹配的组件都不会被缓存</li> <li>router-view 也是一个组件,如果直接被包在 keep-alive 里面,所有路径匹配到的视图组件都会被缓存:</li> </ul> <pre><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>keep-alive</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>router-view</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>!--所有路径匹配到的视图组件都会被缓存!</span> <span class="token attr-name">-</span> <span class="token attr-name">-</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>router-view</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>keep-alive</span><span class="token punctuation">></span></span> </code></pre> <ul> <li>通过create声明周期函数来验证</li> </ul> <h1>Promise</h1> <p><strong>什么是Promise呢?</strong></p> <ul> <li>Promise到底是做什么的呢?<br> ①Promise是异步编程的一种解决方案。</li> <li>那什么时候我们会来处理异步事件呢?<br> ①一种很常见的场景应该就是网络请求了。<br> ②我们封装一个网络请求的函数,因为不能立即拿到结果,所以不能像简单的3+4=7一样将结果返回。<br> ③所以往往我们会传入另外一个函数,在数据请求成功时,将数据通过传入的函数回调出去。<br> ④如果只是一个简单的网络请求,那么这种方案不会给我们带来很大的麻烦。</li> <li>但是当网络请求非常复杂时就会出现回调地狱。</li> <li>我们更加期望的是一种更加优雅的方式来进行这种异步操作。Promise可以以一种非常优雅的方式来解决这个问题。</li> </ul> <p><strong>Promise基本使用:</strong></p> <ul> <li>new Promise很明显是创建一个Promise对象。小括号中((resolve, reject) => {})也很明显就是一个函数,而且我们这里用的是之前刚刚学习过的箭头函数。但是resolve, reject它们是什么呢?</li> <li>我们先知道一个事实:在创建Promise时,传入的这个箭头函数是固定的(一般我们都会这样写)<br> resolve和reject它们两个也是函数,通常情况下,我们会根据请求数据的成功和失败来决定调用哪一个。</li> <li>成功还是失败?<br> ①如果是成功的,那么通常我们会调用resolve(messsage),这个时候,我们后续的then会被回调。<br> ②如果是失败的,那么通常我们会调用reject(error),这个时候,我们后续的catch会被回调。</li> </ul> <pre><code class="prism language-xml">//普通方式 setTimeout( function () { let data = 'Hello World' console. log (content) ; }, 1000) //Promise方式 new Promise((resolve, reject) => { setTimeout( function () { resolve( 'Hello World') reject( 'Error Data') }, 1000) }).then(data => { console. log(data); }).catch(error => { console. log(error); }) </code></pre> <p><strong>Promise三种状态:</strong></p> <ul> <li>当我们开发中有异步操作时, 就可以给异步操作包装一个Promise 异步操作之后会有三种状态<br> ①pending:等待状态,比如正在进行网络请求,或者定时器没有到时间。<br> ②fulfill:满足状态,当我们主动回调了resolve时,就处于该状态,并且会回调.then()<br> ③reject:拒绝状态,当我们主动回调了reject时,就处于该状态,并且会回调.catch()<br> <a href="http://img.e-com-net.com/image/info8/2df12deb4f5d497681354450ac8841d4.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/2df12deb4f5d497681354450ac8841d4.jpg" alt="Vue详解知识概括_第10张图片" width="650" height="241" style="border:1px solid black;"></a></li> </ul> <p><strong>Promise链式调用:</strong></p> <ul> <li>我们在看Promise的流程图时,发现无论是then还是catch都可以返回一个Promise对象。所以,我们的代码其实是可以进行链式调用的:<br> ①这里我们直接通过Promise包装了一下新的数据,将Promise对象返回了<br> <1>Promise.resovle():将数据包装成Promise对象,并且在内部回调resolve()函数<br> <2>Promise.reject():将数据包装成Promise对象,并且在内部回调reject()函数</li> </ul> <pre><code class="prism language-xml">//链式调用的代码 new Promise((resolve, reject) => { setTimeout(function () { resolve('Hello World') },1000 ) }). then(data => { console. log(data); // => Hello World return Promise. resolve(data + '111') }). then(data => { console. log(data); // => Hello World111 return Promise. resolve(data + '222') }). then(data => { console. log(data); // => Hello World111222 return Promise.reject(data + 'error') }). then(data => { console. log(data); //这里没有输出,这部分代码不会执行 return Promise. resolve(data + '333') }).catch(data => { console. log(data); // => Hello World111222error return Promise. resolve(data + '444') }).then(data => { console. log(data); // => Hello World111222error444 }) </code></pre> <ul> <li>简化版代码:如果我们希望数据直接包装成Promise.resolve,那么在then中可以直接返回数据<br> 注意下面的代码中,我将return Promise.resovle(data)改成了return data。结果依然是一样的。</li> </ul> <pre><code class="prism language-xml">//链式调用的简便写法 new Promise((resolve, reject) => { setTimeout(function () { resolve( 'Hello World') },1000) }). then(data => { console. log(data); // => Hello World return data + '111 ' }). then(data => { console. log(data); // => Hello World111 return data + '222' }). then(data => { console. log(data); // => Hello World111222 return Promise. reject(data + 'error') }). then(data => console. log(data); //这里没有输出,这部分代码不会执行 return data + ' 333 }).catch(data => { console. log(data); // => Hello World111222error return data + ' 444 }). then(data => { console. log(data); // => Hello World111222error444 }) </code></pre> <ul> <li><code>如果希望返回的是reject方法,可以直接throw "字符串"。</code></li> </ul> <h1>Vuex</h1> <p><strong>Vuex是做什么的?</strong></p> <ul> <li>官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。<br> ①它采用 集中式存储管理 应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。<br> ②Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。</li> <li>状态管理到底是什么?<br> ①状态管理模式、集中式存储管理这些名词听起来就非常高大上,让人捉摸不透。<br> ②其实,你可以简单的将其看成把需要多个组件共享的变量全部存储在一个对象里面。<br> ③然后,将这个对象放在顶层的Vue实例中,让其他组件可以使用。<br> ④那么,多个组件是不是就可以共享这个对象中的所有变量属性了呢?</li> <li>等等,如果是这样的话,为什么官方还要专门出一个插件Vuex呢?难道我们不能自己封装一个对象来管理吗?<br> ①当然可以,只是我们要先想想VueJS带给我们最大的便利是什么呢?没错,就是响应式。<br> ②如果你自己封装实现一个对象能不能保证它里面所有的属性做到响应式呢?当然也可以,只是自己封装可能稍微麻烦一些。<br> ③不用怀疑,Vuex就是为了提供这样一个在多个组件间共享状态的插件,用它就可以了。</li> </ul> <p><strong>Vuex详解:</strong></p> <ul> <li>但是,有什么状态时需要我们在多个组件间共享的呢?<br> ①如果你做过大型开放,你一定遇到过多个状态,在多个界面间的共享问题。<br> ②比如用户的登录状态、用户名称、头像、地理位置信息等等。<br> ③比如商品的收藏、购物车中的物品等等。<br> ④这些状态信息,我们都可以放在统一的地方,对它进行保存和管理,而且它们还是响应式的(待会儿我们就可以看到代码了,莫着急)。</li> <li>单界面的状态管理:<br> ①State:不用多说,就是我们的状态。(你姑且可以当做就是data中的属性)<br> ②View:视图层,可以针对State的变化,显示不同的信息。(这个好理解吧?)<br> ③Actions:这里的Actions主要是用户的各种操作:点击、输入等等,会导致状态的改变。<br> <a href="http://img.e-com-net.com/image/info8/504282bc34f84064bf9f82a3784e775a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/504282bc34f84064bf9f82a3784e775a.jpg" alt="Vue详解知识概括_第11张图片" width="546" height="370" style="border:1px solid black;"></a></li> <li>多界面状态管理:<br> ①对于某些状态(状态1/状态2/状态3)来说只属于我们某一个试图,但是也有一些状态(状态a/状态b/状态c)属于多个试图共同想要维护的<br> <1>状态1/状态2/状态3你放在自己的房间中,你自己管理自己用,没问题。<br> <2>但是状态a/状态b/状态c我们希望交给一个大管家来统一帮助我们管理!!!<br> <3>没错,Vuex就是为我们提供这个大管家的工具。<br> ②全局单例模式(大管家)<br> <1>我们现在要做的就是将共享的状态抽取出来,交给我们的大管家,统一进行管理。<br> <2>之后,你们每个试图,按照我规定好的规定,进行访问和修改等操作。<br> <3>这就是Vuex背后的基本思想。<br> <a href="http://img.e-com-net.com/image/info8/78f8520f3b97455aaaca426900a153f8.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/78f8520f3b97455aaaca426900a153f8.jpg" alt="Vue详解知识概括_第12张图片" width="650" height="512" style="border:1px solid black;"></a></li> </ul> <p><strong>Vuex基本使用:</strong></p> <ul> <li>首先,我们需要在某个地方存放我们的Vuex代码: 这里,我们先创建一个文件夹store,并且在其中创建一个index.js文件,在index.js文件中写入如下代码:</li> </ul> <pre><code class="prism language-xml">import Vuex from 'vuex' import Vue from 'vue' Vue.use(Vuex) const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++ }, decrement(state) { state.count-- } } }) export default store </code></pre> <ul> <li>其次,我们让所有的Vue组件都可以使用这个store对象 来到main.js文件,导入store对象,并且放在new Vue中这样,在其他Vue组件中,我们就可以通过this.$store的方式,获取到这个store对象了</li> </ul> <pre><code class="prism language-xml">import Vue from 'vue' import App from './App' import store from './store' new Vue({ el: '#app', store, render: h => h(App) }) </code></pre> <ul> <li>使用Vuex的count:</li> </ul> <pre><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>app<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>{{count}}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">@click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>increment<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>+1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">@click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>decrement<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>-1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> <span class="token literal-property property">name</span><span class="token operator">:</span>" App'<span class="token punctuation">,</span> <span class="token literal-property property">components</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token literal-property property">computed</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function-variable function">count</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span> Sstore<span class="token punctuation">.</span>state<span class="token punctuation">.</span>count <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token literal-property property">methods</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function-variable function">increment</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'increment'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function-variable function">decrement</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'decrement'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> </code></pre> <ul> <li>总结:<br> ①小结:<br> <1>提取出一个公共的store对象,用于保存在多个组件中共享的状态<br> <2>将store对象放置在new Vue对象中,这样可以保证在所有的组件中都可以使用到<br> <3>在其他组件中使用store对象中保存的状态即可<br> 1、通过this.$store.state.属性的方式来访问状态<br> 2、通过this.$store.commit(‘mutation中方法’)来修改状态<br> ②注意事项:<br> <1>我们通过提交mutation的方式,而非直接改变store.state.count。<br> <2>这是因为Vuex可以更明确的追踪状态的变化,所以不要直接改变store.state.count的值。</li> </ul> <p><strong>Vuex核心概念:</strong></p> <ul> <li>Vuex有几个比较核心的概念:<br> ①State<br> ②Getters<br> ③Mutation<br> ④Action<br> ⑤Module</li> </ul> <p><strong>State简介:</strong></p> <ul> <li>Vuex提出使用单一状态树, 什么是单一状态树呢?英文名称是Single Source of Truth,也可以翻译成单一数据源。</li> <li>这个和我们在应用开发中比较类似:<br> ①如果你的状态信息是保存到多个Store对象中的,那么之后的管理和维护等等都会变得特别困难。所以Vuex也使用了单一状态树来管理应用层级的全部状态。<br> ②单一状态树能够让我们最直接的方式找到某个状态的片段,而且在之后的维护和调试过程中,也可以非常方便的管理和维护。</li> </ul> <p><strong>Getters简介:</strong></p> <ul> <li>有时候,我们需要从store中获取一些state变异后的状态,我们可以在Store中定义getters。</li> <li>getters默认是不能传递参数的, 如果希望传递参数, 那么只能让getters本身返回另一个函数。</li> <li><code>Getters类似计算属性。</code></li> </ul> <pre><code class="prism language-xml">getters: { //直接获取store数据 greaterAgesStus: state => { return state.students.filter(s => s.age >= 20) }, //获取getters数据 greaterAgesCount: (state, getters) => { return getters.greaterAgesstus.length }, stuByID: state => { return id => { return state.students.find(s => s.id === id) } } } </code></pre> <p><strong>Mutation简介:</strong></p> <ul> <li>Vuex的store状态的更新唯一方式:提交Mutation</li> <li>Mutation主要包括两部分:<br> ①字符串的事件类型(type)<br> ②一个回调函数(handler),该回调函数的第一个参数就是state。</li> </ul> <pre><code class="prism language-xml">//multation的定义方式: mutations: { increment(state) { state.count++ } } //通过mutation更新: increment: function () { this.$store.commit('increment') } </code></pre> <ul> <li>在通过mutation更新数据的时候, 有可能我们希望携带一些额外的参数:参数被称为是mutation的载荷(Payload)。</li> </ul> <pre><code class="prism language-xml">------单参数:------- //multation的定义方式: decrement(state,n) { state.count -= n } //通过mutation更新: decrement: function () { this.Sstore.commit('decrement',2) } ------对象:------- //multation的定义方式: changeCount (state,payload) { state.count = payload.count } //通过mutation更新: changeCount: function () { this.$store.commit('changeCount', {count: 0}) } </code></pre> <ul> <li>Mutation提交风格:<br> ①上面的通过commit进行提交是一种普通的方式。<br> ②Vue还提供了另外一种风格, 它是一个包含type属性的对象:</li> </ul> <pre><code class="prism language-xml">//通过mutation更新: this.$store.commit ({ type:'changeCount' count: 100 }) //Mutation中的处理方式是将整个commit的对象作为payload使用, 所以代码没有改变, 依然如下: changeCount (state,pay1oad) { state.count = payload.count } </code></pre> <ul> <li>Mutation响应规则:<br> ①Vuex的store中的state是响应式的, 当state中的数据发生改变时, Vue组件会自动更新.<br> ②这就要求我们必须遵守一些Vuex对应的规则:<br> <1>提前在store中初始化好所需的属性.<br> <2>当给state中的对象添加新属性时, 使用下面的方式:<br> 方式一: 使用Vue.set(obj, ‘newProp’, 123)<br> 方式二: 用心对象给旧对象重新赋值</li> <li>Mutation常量类型:<br> ①在mutation中, 我们定义了很多事件类型(也就是其中的方法名称),当我们的项目增大时, Vuex管理的状态越来越多, 需要更新状态的情况越来越多, 那么意味着Mutation中的方法越来越多,方法过多, 使用者需要花费大量的经历去记住这些方法, 甚至是多个文件间来回切换, 查看方法名称, 甚至如果不是复制的时候, 可能还会出现写错的情况。<br> ②在各种Flux实现中, 一种很常见的方案就是使用常量替代Mutation事件的类型,我们可以将这些常量放在一个单独的文件中, 方便管理以及让整个app所有的事件类型一目了然。<br> ③我们可以创建一个文件: mutation-types.js, 并且在其中定义我们的常量,定义常量时, 我们可以使用ES2015中的风格, 使用一个常量来作为函数的名称。</li> </ul> <pre><code class="prism language-xml">文件名:mutation-typesjs 代码:export const UPDATE_ INFO = 'UPDATE_INFO' </code></pre> <ul> <li>Mutation同步函数:<br> ①通常情况下, Vuex要求我们Mutation中的方法必须是同步方法,主要的原因是当我们使用devtools时, 可以devtools可以帮助我们捕捉mutation的快照。<br> ②但是如果是异步操作, 那么devtools将不能很好的追踪这个操作什么时候会被完成。所以通常情况下, 不要再mutation中进行异步的操作。</li> </ul> <p><strong>Action简介:</strong></p> <ul> <li>我们强调, 不要再Mutation中进行异步操作. 但是某些情况, 我们确实希望在Vuex中进行一些异步操作, 比如网络请求,必然是异步的. 这个时候怎么处理呢?</li> <li>Action类似于Mutation, 但是是用来代替Mutation进行异步操作的.</li> <li>context是什么?<br> ①<code>context是和store对象具有相同方法和属性的对象.</code><br> ②<code>也就是说, 我们可以通过context去进行commit相关的操作, 也可以获取context.state等.但是注意, 这里它们并不是同一个对象, 为什么呢? 我们后面学习Modules的时候, 再具体说。</code></li> <li>这样的代码是否多此一举呢?<br> ①我们定义了actions, 然后又在actions中去进行commit, 这不是脱裤放屁吗?<br> ②事实上并不是这样, 如果在Vuex中有异步操作, 那么我们就可以在actions中完成了.</li> <li>Action的分发:<br> ①在Vue组件中, 如果我们调用action中的方法, 那么就需要使用dispatch。<br> ②同样的, 也是支持传递payload</li> <li>Action返回的Promise:<br> ①<code>在Action中, 我们可以将异步操作放在一个Promise中, 并且在成功或者失败后, 调用对应的resolve或reject。</code></li> </ul> <pre><code class="prism language-xml">\\定义: const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++ } }, actions: { increment (context) { context.commit('increment') } } }) \\使用: methods: { increment() { this.$store.dispatch('increment') } } </code></pre> <p><strong>Module简介:</strong></p> <ul> <li>Module是模块的意思, 为什么在Vuex中我们要使用模块呢?<br> ①Vue使用单一状态树,那么也意味着很多状态都会交给Vuex来管理,当应用变得非常复杂时,store对象就有可能变得相当臃肿。<br> ②<code>为了解决这个问题, Vuex允许我们将store分割成模块(Module), 而每个模块拥有自己的state、mutation、action、getters等。</code></li> <li>注意:<br> ①虽然, 我们的<code>getters</code>和<code>mutation</code>都是定义在对象内部的,但是在调用的时候, 依然是通过this.$store来直接调用的。<br> ②actions:<br> <1><code>局部状态通过 context.state 暴露出来,根节点状态则为 context.rootState</code><br> <2>如果getters中也需要使用全局的状态, 可以接受更多的参数</li> </ul> <pre><code class="prism language-xml">const moduleA = { //... actions: { incrementIfoddonRootSum ({state,commit,rootState}) { if ((state.count + rootState.count) %2 ===1) { commit('increment') } } } } </code></pre> <ul> <li>代码结构:</li> </ul> <pre><code class="prism language-xml">const moduleA = { state: { ... }, mutations: { ... }, actions: { ... }, getters: { ... } } const moduleB = { state: { ... }, mutations: { ... }, actions: { ... } } const store = new Vuex.Store({ modules: { a: modu1eA, b: modu1eB } }) store.state.a // -> moduleA的状态 store.state.b // -> moduleB的状态 </code></pre> <p><strong>项目结构:</strong></p> <ul> <li>当我们的Vuex帮助我们管理过多的内容时, 好的项目结构可以让我们的代码更加清晰:<br> <a href="http://img.e-com-net.com/image/info8/52dd92d1b0024c4880057495ff37453d.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/52dd92d1b0024c4880057495ff37453d.jpg" alt="Vue详解知识概括_第13张图片" width="650" height="321" style="border:1px solid black;"></a></li> </ul> <h1>axios</h1> <p><strong>选择什么网络模块?</strong></p> <ul> <li>选择一: 传统的Ajax是基于XMLHttpRequest(XHR)<br> ①为什么不用它呢?<br> <1>非常好解释, 配置和调用方式等非常混乱.<br> <2>编码起来看起来就非常蛋疼.<br> <3>所以真实开发中很少直接使用, 而是使用jQuery-Ajax</li> <li>选择二: 在前面的学习中, 我们经常会使用jQuery-Ajax<br> ①相对于传统的Ajax非常好用.<br> ②为什么不选择它呢?<br> <1>首先, 我们先明确一点: 在Vue的整个开发中都是不需要使用jQuery了.<br> <2>那么, 就意味着为了方便我们进行一个网络请求, 特意引用一个jQuery, 你觉得合理吗?<br> <3>jQuery的代码1w+行.<br> <4>Vue的代码才1w+行.<br> <5>完全没有必要为了用网络请求就引用这个重量级的框架.</li> <li>选择三: 官方在Vue1.x的时候, 推出了Vue-resource.<br> ①Vue-resource的体积相对于jQuery小很多.<br> ②另外Vue-resource是官方推出的.<br> ③为什么不选择它呢?<br> <1>在Vue2.0退出后, Vue作者就在GitHub的Issues中说明了去掉vue-resource, 并且以后也不会再更新.<br> <2>那么意味着以后vue-reource不再支持新的版本时, 也不会再继续更新和维护.<br> <3>对以后的项目开发和维护都存在很大的隐患.</li> <li>选择四: 在说明不再继续更新和维护vue-resource的同时, 作者还推荐了一个框架: axios为什么不用它呢?<br> ①axios有非常多的优点, 并且用起来也非常方便.<br> ②稍后, 我们对他详细学习.</li> </ul> <p><strong>jsonp:</strong></p> <ul> <li>在前端开发中, 我们一种常见的网络请求方式就是JSONP<br> ①使用JSONP最主要的原因往往是为了解决跨域访问的问题.</li> <li>JSONP的原理是什么呢?<br> ①JSONP的核心在于通过<script>标签的src来帮助我们请求数据.<br> ②原因是我们的项目部署在domain1.com服务器上时, 是不能直接访问domain2.com服务器上的资料的.<br> ③这个时候, 我们利用<script>标签的src帮助我们去服务器请求到数据, 将数据当做一个javascript的函数来执行, 并且执行的过程中传入我们需要的json.<br> ④所以, 封装jsonp的核心就在于我们监听window上的jsonp进行回调时的名称.</li> <li>JSONP如何封装呢?<br> ①我们一起自己来封装一个处理JSONP的代码吧.<br> <a href="http://img.e-com-net.com/image/info8/d6fbed0d1e7f4fda9ae6d5891ae11f9f.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/d6fbed0d1e7f4fda9ae6d5891ae11f9f.jpg" alt="Vue详解知识概括_第14张图片" width="591" height="728" style="border:1px solid black;"></a></li> </ul> <p><strong>为什么选择axios?</strong></p> <ul> <li>功能特点:<br> ①在浏览器中发送 XMLHttpRequests 请求<br> ②在 node.js 中发送 http请求<br> ③支持 Promise API<br> ④拦截请求和响应<br> ⑤转换请求和响应数据</li> </ul> <p><strong>axiox请求方式:</strong></p> <ul> <li>支持多种请求方式:<br> ①axios(config)<br> ②axios.request(config)<br> ③axios.get(url[, config])<br> ④axios.delete(url[, config])<br> ⑤axios.head(url[, config])<br> ⑥axios.post(url[, data[, config]])<br> ⑦axios.put(url[, data[, config]])<br> ⑧axios.patch(url[, data[, config]])</li> <li>发送get请求演示:</li> </ul> <pre><code class="prism language-xml">import axios from 'axios' export default { name : 'app', created() { //提问:为什么我这里没有跨域的问题?// 1.没有请求参数 axios.get( 'http://123.207.32.32:8000/category') .then(res => { console.log(res); }).catch(err =>{ console.log(err); }) //2.有请求参数 axios.get( 'http:/ /123.207.32.32:8000/home/data', {params: itype: 'sell', page: 1}}) .then(res => { console.log ( res); }).catch(err => { console.log(err); }) } } </code></pre> <ul> <li>发送并发请求:<br> ①有时候, 我们可能需求同时发送两个请求<br> ②使用axios.all, 可以放入多个请求的数组.<br> ③axios.all([]) 返回的结果是一个数组,使用 axios.spread 可将数组 [res1,res2] 展开为 res1, res2</li> </ul> <pre><code class="prism language-xml">import axios from 'axios' export default { name : 'app', created () {[ //发送并发请求 axios.all([axios.get('http://123.207.32.32:8000/category'), axios.get('http://123.207.32.32:8000/home/data', {params : {type: 'sell', page: 1}})]) .then(axios.spread((res1,res2) => { console.log(res1); console.log(res2); })) } </code></pre> <p><strong>全局配置:</strong></p> <ul> <li>在上面的示例中, 我们的BaseURL是固定的<br> ①事实上, 在开发中可能很多参数都是固定的.<br> ②这个时候我们可以进行一些抽取, 也可以利用axiox的全局配置</li> </ul> <pre><code class="prism language-xml">created( { //提取全局的配置 axios.defaults.baseURL = 'http://123.207.32.32:8000' //发送并发请求 axios.all([ axios.get('/category'), axios.get('/home/data', {params: {type: 'sell', page:1}})]) .then(axios.spread((res1,res2) =>{ console.log (res1); console.log(res2); })) } </code></pre> <ul> <li>常见的配置选项:</li> </ul> <pre><code class="prism language-xml">请求地址 url: '/user', 请求类型 method: 'get', 请根路径 baseURL: 'http://www.mt.com/api', 请求前的数据处理 transformRequest:[function(data){}], 请求后的数据处理 transformResponse: [function(data){}], 自定义的请求头 headers:{'x-Requested-With':'XMLHttpRequest'}, URL查询对象 params:{ id: 12 }, 查询对象序列化函数 paramsSerializer: function(params){ } request body data: { key: 'aa'}, 超时设置s timeout: 1000, 跨域是否带Token withCredentials: false, 自定义请求处理 adapter: function(resolve, reject, config){}, 身份验证信息 auth: { uname: '', pwd: '12'}, 响应的数据格式 json / blob /document /arraybuffer / text / stream responseType: 'json', </code></pre> <p><strong>axios的实例:</strong></p> <ul> <li>为什么要创建axios的实例呢?<br> ①当我们从axios模块中导入对象时, 使用的实例是默认的实例.<br> ②当给该实例设置一些默认配置时, 这些配置就被固定下来了.<br> ③但是后续开发中, 某些配置可能会不太一样.<br> ④比如某些请求需要使用特定的baseURL或者timeout或者content-Type等.<br> ⑤这个时候, 我们就可以创建新的实例, 并且传入属于该实例的配置信息.</li> </ul> <pre><code class="prism language-xml">//创建新的实例 const axiosInstance = axios.create({ baseURL: 'http:/ /123.207.32.32:8000', timeout: 5000, headers: { 'Content-Type' : 'application/x-www-form-urlencoded ' } }) //发送网络请求 axiosInstance({ url: '/category', method: 'get' }).then(res => { console. log(res); }).catch(err => { console. log(err); }) </code></pre> <ul> <li>axios封装:</li> </ul> <pre><code class="prism language-xml">import originAxios from 'axios' export default function axios(option) { return new Promise((resolve, reject) =>{ //1.创建axios的实例 const instance = originAxios.create({ baseURL: '/api', timeout: 5000, headers:'' }); //2.传入对象进行网络请求 instance(option).then(res => { resolve(res) }).catch(err => { reject(err) }) }) } </code></pre> <p><strong>axios拦截器:</strong></p> <ul> <li>axios提供了拦截器,用于我们在发送每次请求或者得到相应后,进行对应的处理。</li> <li>如何使用拦截器呢?</li> </ul> <pre><code class="prism language-xml">//配置请求和响应拦截 instance.interceptors.request.use(config =>{ console.log('来到了request拦截success中'); return config }, err => { console.log('来到了request拦截failure中'); return err } instance.interceptors.response.use(response =>{ console.log('来到了response拦截success中'); return response.data }, err =>{ console.log('来到了response拦截failure中'); return err }) </code></pre> <ul> <li>拦截器中都做什么呢?<br> ①请求拦截中错误拦截较少,通常都是配置相关的拦截。可能的错误比如请求超时,可以将页面跳转到一个错误页面中。<br> ②响应拦截中完成的事情:<br> <1>响应的成功拦截中,主要是对数据进行过滤。<br> <2>响应的失败拦截中,可以根据status判断报错的错误码,跳转到不同的错误提示页面。</li> </ul> <pre><code class="prism language-xml">//请求拦截 instance.interceptors.request.use(config =>{ console.log('来到了request拦截success中'); //1.当发送网络请求时,在页面中添加一个loading组件,作为动画 //2.某些请求要求用户必须登录,判断用户是否有token,如果没有token跳转到login页面 //3.对请求的参数进行序列化 config.data = qs.stringify (config.data) console.log(config); //4.等等 return config }) //响应的成功拦截 instance.interceptors.response.use(response => { console.log('来到了response拦截success中'); return response.data }) //响应的失败拦截 },err =>{ console.log('来到了response拦截failure中'); if (err && err.response) { switch (err.response.status) { case 400: err.message ='请求错误' break case 401: err.message ='未授权的访问' break } } return err </code></pre> <h1>Vue开发总结</h1> <p><strong>VSCode开发简介:</strong></p> <ul> <li>我们在html文件上输入【!】叹号(在英文状态下),然后按键盘的【Tab】键,只有在这种情况下按住Tab键可以快速创建一个html模板。</li> <li>代码缩进时只缩进两个空格。</li> <li>开发快捷键:<br> ①Ctrl + p:查找文件<br> ②Ctrl + shift + f:全局搜索字符串<br> ③Ctrl+j:切换终端<br> ④Ctrl + b:显示/隐藏左侧目录栏<br> ⑤Ctrl + shift + p,F1:显示所有命令<br> ⑥拆分当前编辑窗口:Ctrl + \ ,Ctrl +1 2 3 4 等 在编辑窗口间切换<br> ⑦选中方法名->Shift + F12,选中方法名->鼠标右键:显示引用 Show References</li> <li>链接:VSCode Vue开发推荐插件和VSCode快捷键(小结)</li> <li>插件:<br> ①Volar 是一个 vscode 的插件,volar提供了非常卧槽的功能。</li> </ul> <p><strong>Vue开发简介:</strong></p> <ul> <li>src目录分析:<br> ①apis:请求后台接口文件<br> ②assets:资源文件,比如存放 css,图片等资源。<br> ③component​:组件文件夹,用来存放 vue 的公共组件(注册于全局,在整个项目中通过关键词便可直接输出)<br> ④router​:用来存放 ​index.js​,这个 js 用来配置路由<br> ⑤views​:用来放主体页面,虽然和组件文件夹都是 vue 文件,但 views 下的 vue 文件是可以用来充当路由 view 的。<br> ⑥store:Vuex状态管理文件<br> ⑦tool​/utils:用来存放工具类 js,将 js 代码封装好放入这个文件夹可以全局调用(比如常见的​ api.js​,​http.js​ 是对 http 方法和 api 方法的封装)。<br> ⑧request:http工具类,可以放在tool/utils中,也可以自定义一个文件夹。</li> </ul> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1550264406355546112"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(前端,vue.js,javascript,webpack)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835512920797179904.htm" title="element实现动态路由+面包屑" target="_blank">element实现动态路由+面包屑</a> <span class="text-muted">软件技术NINI</span> <a class="tag" taget="_blank" href="/search/vue%E6%A1%88%E4%BE%8B/1.htm">vue案例</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>el-breadcrumb是ElementUI组件库中的一个面包屑导航组件,它用于显示当前页面的路径,帮助用户快速理解和导航到应用的各个部分。在Vue.js项目中,如果你已经安装了ElementUI,就可以很方便地使用el-breadcrumb组件。以下是一个基本的使用示例:安装ElementUI(如果你还没有安装的话):你可以通过npm或yarn来安装ElementUI。bash复制代码npmi</div> </li> <li><a href="/article/1835509897106649088.htm" title="Long类型前后端数据不一致" target="_blank">Long类型前后端数据不一致</a> <span class="text-muted">igotyback</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>响应给前端的数据浏览器控制台中response中看到的Long类型的数据是正常的到前端数据不一致前后端数据类型不匹配是一个常见问题,尤其是当后端使用Java的Long类型(64位)与前端JavaScript的Number类型(最大安全整数为2^53-1,即16位)进行数据交互时,很容易出现精度丢失的问题。这是因为JavaScript中的Number类型无法安全地表示超过16位的整数。为了解决这个问</div> </li> <li><a href="/article/1835498925755297792.htm" title="DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理" target="_blank">DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理</a> <span class="text-muted">STU学生网页设计</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/%E6%9C%9F%E6%9C%AB%E7%BD%91%E9%A1%B5%E4%BD%9C%E4%B8%9A/1.htm">期末网页作业</a><a class="tag" taget="_blank" href="/search/html%E9%9D%99%E6%80%81%E7%BD%91%E9%A1%B5/1.htm">html静态网页</a><a class="tag" taget="_blank" href="/search/html5%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">html5期末大作业</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/web%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web大作业</a> <div>️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程</div> </li> <li><a href="/article/1835497792265613312.htm" title="【加密社】Solidity 中的事件机制及其应用" target="_blank">【加密社】Solidity 中的事件机制及其应用</a> <span class="text-muted">加密社</span> <a class="tag" taget="_blank" href="/search/%E9%97%B2%E4%BE%83/1.htm">闲侃</a><a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a><a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6/1.htm">智能合约</a><a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a> <div>加密社引言在Solidity合约开发过程中,事件(Events)是一种非常重要的机制。它们不仅能够让开发者记录智能合约的重要状态变更,还能够让外部系统(如前端应用)监听这些状态的变化。本文将详细介绍Solidity中的事件机制以及如何利用不同的手段来触发、监听和获取这些事件。事件存储的地方当我们在Solidity合约中使用emit关键字触发事件时,该事件会被记录在区块链的交易收据中。具体而言,事件</div> </li> <li><a href="/article/1835496149843275776.htm" title="关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript" target="_blank">关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a><a class="tag" taget="_blank" href="/search/%E9%A3%8E%E6%99%AF/1.htm">风景</a> <div>⛵源码获取文末联系✈Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业|游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作|HTML期末大学生网页设计作业,Web大学生网页HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScrip</div> </li> <li><a href="/article/1835496148601761792.htm" title="HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动" target="_blank">HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</a><a class="tag" taget="_blank" href="/search/web%E8%AE%BE%E8%AE%A1%E7%BD%91%E9%A1%B5%E8%A7%84%E5%88%92%E4%B8%8E%E8%AE%BE%E8%AE%A1/1.htm">web设计网页规划与设计</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/dreamweaver/1.htm">dreamweaver</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作HTML期末大学生网页设计作业HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScript:做与用户的交互行为文章目录前端学习路线</div> </li> <li><a href="/article/1835493267907637248.htm" title="webpack图片等资源的处理" target="_blank">webpack图片等资源的处理</a> <span class="text-muted">dmengmeng</span> <div>需要的loaderfile-loader(让我们可以引入这些资源文件)url-loader(其实是file-loader的二次封装)img-loader(处理图片所需要的)在没有使用任何处理图片的loader之前,比如说css中用到了背景图片,那么最后打包会报错的,因为他没办法处理图片。其实你只想能够使用图片的话。只加一个file-loader就可以,打开网页能准确看到图片。{test:/\.(p</div> </li> <li><a href="/article/1835492740536823808.htm" title="node.js学习" target="_blank">node.js学习</a> <span class="text-muted">小猿L</span> <a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a> <div>node.js学习实操及笔记温故node.js,node.js学习实操过程及笔记~node.js学习视频node.js官网node.js中文网实操笔记githubcsdn笔记为什么学node.js可以让别人访问我们编写的网页为后续的框架学习打下基础,三大框架vuereactangular离不开node.jsnode.js是什么官网:node.js是一个开源的、跨平台的运行JavaScript的运行</div> </li> <li><a href="/article/1835448238103162880.htm" title="springboot+vue项目实战一-创建SpringBoot简单项目" target="_blank">springboot+vue项目实战一-创建SpringBoot简单项目</a> <span class="text-muted">苹果酱0567</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98%E6%B1%87%E6%80%BB%E4%B8%8E%E8%A7%A3%E6%9E%90/1.htm">面试题汇总与解析</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%B8%AD%E9%97%B4%E4%BB%B6/1.htm">中间件</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>这段时间抽空给女朋友搭建一个个人博客,想着记录一下建站的过程,就当做笔记吧。虽然复制zjblog只要一个小时就可以搞定一个网站,或者用cms系统,三四个小时就可以做出一个前后台都有的网站,而且想做成啥样也都行。但是就是要从新做,自己做的意义不一样,更何况,俺就是专门干这个的,嘿嘿嘿要做一个网站,而且从零开始,首先呢就是技术选型了,经过一番思量决定选择-SpringBoot做后端,前端使用Vue做一</div> </li> <li><a href="/article/1835448239864770560.htm" title="JavaScript 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)" target="_blank">JavaScript 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)</a> <span class="text-muted">跳房子的前端</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95/1.htm">前端面试</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>在JavaScript中,深拷贝(DeepCopy)和浅拷贝(ShallowCopy)是用于复制对象或数组的两种不同方法。了解它们的区别和应用场景对于避免潜在的bugs和高效地处理数据非常重要。以下是对深拷贝和浅拷贝的详细解释,包括它们的概念、用途、优缺点以及实现方式。1.浅拷贝(ShallowCopy)概念定义:浅拷贝是指创建一个新的对象或数组,其中包含了原对象或数组的基本数据类型的值和对引用数</div> </li> <li><a href="/article/1835437775344726016.htm" title="博客网站制作教程" target="_blank">博客网站制作教程</a> <span class="text-muted">2401_85194651</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>首先就是技术框架:后端:Java+SpringBoot数据库:MySQL前端:Vue.js数据库连接:JPA(JavaPersistenceAPI)1.项目结构blog-app/├──backend/│├──src/main/java/com/example/blogapp/││├──BlogApplication.java││├──config/│││└──DatabaseConfig.java</div> </li> <li><a href="/article/1835428948339683328.htm" title="JavaScript `Map` 和 `WeakMap`详细解释" target="_blank">JavaScript `Map` 和 `WeakMap`详细解释</a> <span class="text-muted">跳房子的前端</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E5%8E%9F%E7%94%9F%E6%96%B9%E6%B3%95/1.htm">原生方法</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在JavaScript中,Map和WeakMap都是用于存储键值对的数据结构,但它们有一些关键的不同之处。MapMap是一种可以存储任意类型的键值对的集合。它保持了键值对的插入顺序,并且可以通过键快速查找对应的值。Map提供了一些非常有用的方法和属性来操作这些数据对:set(key,value):将一个键值对添加到Map中。如果键已经存在,则更新其对应的值。get(key):获取指定键的值。如果键</div> </li> <li><a href="/article/1835428317084348416.htm" title="最简单将静态网页挂载到服务器上(不用nginx)" target="_blank">最简单将静态网页挂载到服务器上(不用nginx)</a> <span class="text-muted">全能全知者</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>最简单将静态网页挂载到服务器上(不用nginx)如果随便弄个静态网页挂在服务器都要用nignx就太麻烦了,所以直接使用Apache来搭建一些简单前端静态网页会相对方便很多检查Web服务器服务状态:sudosystemctlstatushttpd#ApacheWeb服务器如果发现没有安装web服务器:安装Apache:sudoyuminstallhttpd启动Apache:sudosystemctl</div> </li> <li><a href="/article/1835427057752961024.htm" title="补充元象二面" target="_blank">补充元象二面</a> <span class="text-muted">Redstone Monstrosity</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>1.请尽可能详细地说明,防抖和节流的区别,应用场景?你的回答中不要写出示例代码。防抖(Debounce)和节流(Throttle)是两种常用的前端性能优化技术,它们的主要区别在于如何处理高频事件的触发。以下是防抖和节流的区别和应用场景的详细说明:防抖和节流的定义防抖:在一段时间内,多次执行变为只执行最后一次。防抖的原理是,当事件被触发后,设置一个延迟定时器。如果在这个延迟时间内事件再次被触发,则重</div> </li> <li><a href="/article/1835420753252675584.htm" title="微信小程序开发注意事项" target="_blank">微信小程序开发注意事项</a> <span class="text-muted">jun778895</span> <a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">微信小程序</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a> <div>微信小程序开发是一个融合了前端开发、用户体验设计、后端服务(可选)以及微信小程序平台特性的综合性项目。这里,我将详细介绍一个典型的小程序开发项目的全过程,包括项目规划、设计、开发、测试及部署上线等各个环节,并尽量使内容达到或超过2000字的要求。一、项目规划1.1项目背景与目标假设我们要开发一个名为“智慧校园助手”的微信小程序,旨在为学生提供一站式校园生活服务,包括课程表查询、图书馆座位预约、食堂</div> </li> <li><a href="/article/1835419870070665216.htm" title="切换淘宝最新npm镜像源是" target="_blank">切换淘宝最新npm镜像源是</a> <span class="text-muted">hai40587</span> <a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>切换淘宝最新npm镜像源是一个相对简单的过程,但首先需要明确当前淘宝npm镜像源的状态和最新的镜像地址。由于网络环境和服务更新,镜像源的具体地址可能会发生变化,因此,我将基于当前可获取的信息,提供一个通用的切换步骤,并附上最新的镜像地址(截至回答时)。一、了解npm镜像源npm(NodePackageManager)是JavaScript的包管理器,用于安装、更新和管理项目依赖。由于npm官方仓库</div> </li> <li><a href="/article/1835411044768509952.htm" title="字节二面" target="_blank">字节二面</a> <span class="text-muted">Redstone Monstrosity</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>1.假设你是正在面试前端开发工程师的候选人,面试官让你详细说出你上一段实习过程的收获和感悟。在上一段实习过程中,我获得了宝贵的实践经验和深刻的行业洞察,以下是我的主要收获和感悟:一、专业技能提升框架应用熟练度:通过实际项目,我深入掌握了React、Vue等前端框架的使用,不仅提升了编码效率,还学会了如何根据项目需求选择合适的框架。问题解决能力:在实习期间,我遇到了许多预料之外的技术难题。通过查阅文</div> </li> <li><a href="/article/1835398064727224320.htm" title="前端代码上传文件" target="_blank">前端代码上传文件</a> <span class="text-muted">余生逆风飞翔</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>点击上传文件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</div> </li> <li><a href="/article/1835390752381825024.htm" title="详解“c:/work/src/components/a/b.vue“‘ has no default export报错原因" target="_blank">详解“c:/work/src/components/a/b.vue“‘ has no default export报错原因</a> <span class="text-muted">hw_happy</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>前情提要在一个vue文件中需要引入定义的b.vue文件,但是提示b文件没有默认导出,对于vue2文件来说有exportdefault,在中,所有定义的变量、函数和组件都会自动被视为默认导出的组件内容。因此,不需要显式地使用exportdefault来导出组件。但是在我引用这个文件的时候还是提示了这个错误,原来是我的项目使用了ts和vite\webpack,因为TypeScript和Vue的默认导出</div> </li> <li><a href="/article/1835385458356482048.htm" title="uniapp实现动态标记效果详细步骤【前端开发】" target="_blank">uniapp实现动态标记效果详细步骤【前端开发】</a> <span class="text-muted">2401_85123349</span> <a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a> <div>第二个点在于实现将已经被用户标记的内容在下一次获取后刷新它的状态为已标记。这是什么意思呢?比如说上面gif图中的这些人物对象,有一些已被该用户添加为关心,那么当用户下一次进入该页面时,这些已经被添加关心的对象需要以“红心”状态显现出来。这个点的难度还不算大,只需要在每一次获取后端的内容后对标记对象进行状态更新即可。II.动态标记效果实现思路和步骤首先,整体的思路是利用动态类名对不同的元素进行选择。</div> </li> <li><a href="/article/1835383919906746368.htm" title="高性能javascript--算法和流程控制" target="_blank">高性能javascript--算法和流程控制</a> <span class="text-muted">海淀萌狗</span> <div>-for,while和do-while性能相当-避免使用for-in循环,==除非遍历一个属性量未知的对象==es5:for-in遍历的对象便不局限于数组,还可以遍历对象。原因:for-in每次迭代操作会同时搜索实例或者原型属性,for-in循环的每次迭代都会产生更多开销,因此要比其他循环类型慢,一般速度为其他类型循环的1/7。因此,除非明确需要迭代一个属性数量未知的对象,否则应避免使用for-i</div> </li> <li><a href="/article/1835373236217540608.htm" title="360前端星计划-动画可以这么玩" target="_blank">360前端星计划-动画可以这么玩</a> <span class="text-muted">马小蜗</span> <div>动画的基本原理定时器改变对象的属性根据新的属性重新渲染动画functionupdate(context){//更新属性}constticker=newTicker();ticker.tick(update,context);动画的种类1、JavaScript动画操作DOMCanvas2、CSS动画transitionanimation3、SVG动画SMILJS动画的优缺点优点:灵活度、可控性、性能</div> </li> <li><a href="/article/1835368019430305792.htm" title="Vue + Express实现一个表单提交" target="_blank">Vue + Express实现一个表单提交</a> <span class="text-muted">九旬大爷的梦</span> <div>最近在折腾一个cms系统,用的vue+express,但是就一个表单提交就弄了好久,记录一下。环境:Node10+前端:Vue服务端:Express依赖包:vueexpressaxiosexpress-formidableelement-ui(可选)前言:axiosget请求参数是:paramsaxiospost请求参数是:dataexpressget接受参数是req.queryexpresspo</div> </li> <li><a href="/article/1835360244646113280.htm" title="JavaScript中秋快乐!" target="_blank">JavaScript中秋快乐!</a> <span class="text-muted">Q_w7742</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>我们来实现一个简单的祝福网页~主要的难度在于使用canvas绘图当点击canvas时候,跳出“中秋节快乐”字样,需要注册鼠标单击事件和计时器。首先定义主要函数:初始化当点击canvas之后转到onCanvasClick函数,绘图生成灯笼。functiononCanvasClick(){//事件处理函数context.clearRect(0,0,canvas1.width,canvas1.heigh</div> </li> <li><a href="/article/1835359727924637696.htm" title="Nginx从入门到实践(三)" target="_blank">Nginx从入门到实践(三)</a> <span class="text-muted">听你讲故事啊</span> <div>动静分离动静分离是将网站静态资源(JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。动静分离的一种做法是将静态资源部署在nginx上,后台项目部署到应用服务器上,根据一定规则静态资源的请求全部请求nginx服务器,达到动静分离的目标。rewrite规则Rewrite规则常见正则表达式Rewrite主要的功能就是实现URL的重写,Ngin</div> </li> <li><a href="/article/1835354700392787968.htm" title="Nginx的使用场景:构建高效、可扩展的Web架构" target="_blank">Nginx的使用场景:构建高效、可扩展的Web架构</a> <span class="text-muted">张某布响丸辣</span> <a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>Nginx,作为当今最流行的Web服务器和反向代理软件之一,凭借其高性能、稳定性和灵活性,在众多Web项目中扮演着核心角色。无论是个人博客、中小型网站,还是大型企业级应用,Nginx都能提供强大的支持。本文将探讨Nginx的几个主要使用场景,帮助读者理解如何在实际项目中充分利用Nginx的优势。1.静态文件服务对于包含大量静态文件(如HTML、CSS、JavaScript、图片等)的网站,Ngin</div> </li> <li><a href="/article/1835354447627251712.htm" title="前端知识点" target="_blank">前端知识点</a> <span class="text-muted">ZhangTao_zata</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>下面是一个最基本的html代码body{font-family:Arial,sans-serif;margin:20px;}//JavaScriptfunctionthatdisplaysanalertwhencalledfunctionshowMessage(){alert("Hello!Youclickedthebutton.");}MyFirstHTMLPageWelcometoMyPage</div> </li> <li><a href="/article/1835352325032603648.htm" title="第三十一节:Vue路由:前端路由vs后端路由的了解" target="_blank">第三十一节:Vue路由:前端路由vs后端路由的了解</a> <span class="text-muted">曹老师</span> <div>1.认识前端路由和后端路由前端路由相对于后端路由而言的,在理解前端路由之前先对于路由有一个基本的了解路由:简而言之,就是把信息从原地址传输到目的地的活动对于我们来说路由就是:根据不同的url地址展示不同的页面内容1.1后端路由以前咱们接触比较多的后端路由,当改变url地址时,浏览器会向服务器发送请求,服务器根据这个url,返回不同的资源内容后端路由的特点就是前端每次跳转到不同url地址,都会重新访</div> </li> <li><a href="/article/1835350917352878080.htm" title="华雁智科前端面试题" target="_blank">华雁智科前端面试题</a> <span class="text-muted">因为奋斗超太帅啦</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E7%AC%94%E8%AF%95%E9%9D%A2%E8%AF%95%E9%97%AE%E9%A2%98%E6%95%B4%E7%90%86/1.htm">前端笔试面试问题整理</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>1.var变量的提升题目:vara=1functionfun(){console.log(b)varb=2}fun()console.log(a)正确输出结果:undefined、1答错了,给一个大嘴巴子,错误答案输出结果为:2,1此题主要考察var定义的变量,作用域提升的问题,相当于varaa=1functionfun(){varbconsole.log(b)b=2}fun()console.l</div> </li> <li><a href="/article/1835350535818014720.htm" title="如何建设数据中台(五)——数据汇集—打破企业数据孤岛" target="_blank">如何建设数据中台(五)——数据汇集—打破企业数据孤岛</a> <span class="text-muted">weixin_47088026</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95%E5%92%8C%E6%80%BB%E7%BB%93/1.htm">学习记录和总结</a><a class="tag" taget="_blank" href="/search/%E4%B8%AD%E5%8F%B0/1.htm">中台</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E4%B8%AD%E5%8F%B0/1.htm">数据中台</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/1.htm">程序人生</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a> <div>数据汇集——打破企业数据孤岛要构建企业级数据中台,第一步就是将企业内部各个业务系统的数据实现互通互联,打破数据孤岛,主要通过数据汇聚和交换来实现。企业采集的数据可以是线上采集、线下数据采集、互联网数据采集、内部数据采集等。线上数据采集主要载体分为互联网和移动互联网两种,对应有系统平台、网页、H5、小程序、App等,可以采用前端或后端埋点方式采集数据。线下数据采集主要是通过硬件来采集,例如:WiFi</div> </li> <li><a href="/article/76.htm" title="遍历dom 并且存储(将每一层的DOM元素存在数组中)" target="_blank">遍历dom 并且存储(将每一层的DOM元素存在数组中)</a> <span class="text-muted">换个号韩国红果果</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>数组从0开始!! var a=[],i=0; for(var j=0;j<30;j++){ a[j]=[];//数组里套数组,且第i层存储在第a[i]中 } function walkDOM(n){ do{ if(n.nodeType!==3)//筛选去除#text类型 a[i].push(n); //con</div> </li> <li><a href="/article/203.htm" title="Android+Jquery Mobile学习系列(9)-总结和代码分享" target="_blank">Android+Jquery Mobile学习系列(9)-总结和代码分享</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/JQuery+Mobile/1.htm">JQuery Mobile</a> <div>目录导航   经过一个多月的边学习边练手,学会了Android基于Web开发的毛皮,其实开发过程中用Android原生API不是很多,更多的是HTML/Javascript/Css。   个人觉得基于WebView的Jquery Mobile开发有以下优点: 1、对于刚从Java Web转型过来的同学非常适合,只要懂得HTML开发就可以上手做事。 2、jquerym</div> </li> <li><a href="/article/330.htm" title="impala参考资料" target="_blank">impala参考资料</a> <span class="text-muted">dayutianfei</span> <a class="tag" taget="_blank" href="/search/impala/1.htm">impala</a> <div>记录一些有用的Impala资料   1. 入门资料 >>官网翻译:     http://my.oschina.net/weiqingbin/blog?catalog=423691   2. 实用进阶 >>代码&架构分析:     Impala/Hive现状分析与前景展望:http</div> </li> <li><a href="/article/457.htm" title="JAVA 静态变量与非静态变量初始化顺序之新解" target="_blank">JAVA 静态变量与非静态变量初始化顺序之新解</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%9D%99%E6%80%81/1.htm">静态</a><a class="tag" taget="_blank" href="/search/%E9%9D%9E%E9%9D%99%E6%80%81/1.htm">非静态</a><a class="tag" taget="_blank" href="/search/%E9%A1%BA%E5%BA%8F/1.htm">顺序</a> <div>今天和同事争论一问题,关于静态变量与非静态变量的初始化顺序,谁先谁后,最终想整理出来!测试代码: import java.util.Map; public class T { public static T t = new T(); private Map map = new HashMap(); public T(){ System.out.println(&quo</div> </li> <li><a href="/article/584.htm" title="跳出iframe返回外层页面" target="_blank">跳出iframe返回外层页面</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/iframe/1.htm">iframe</a> <div>在web开发过程中难免要用到iframe,但当连接超时或跳转到公共页面时就会出现超时页面显示在iframe中,这时我们就需要跳出这个iframe到达一个公共页面去。 首先跳转到一个中间页,这个页面用于判断是否在iframe中,在页面加载的过程中调用如下代码: <script type="text/javascript"> //<!-- function</div> </li> <li><a href="/article/711.htm" title="JAVA多线程监听JMS、MQ队列" target="_blank">JAVA多线程监听JMS、MQ队列</a> <span class="text-muted">510888780</span> <a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a> <div>背景:消息队列中有非常多的消息需要处理,并且监听器onMessage()方法中的业务逻辑也相对比较复杂,为了加快队列消息的读取、处理速度。可以通过加快读取速度和加快处理速度来考虑。因此从这两个方面都使用多线程来处理。对于消息处理的业务处理逻辑用线程池来做。对于加快消息监听读取速度可以使用1.使用多个监听器监听一个队列;2.使用一个监听器开启多线程监听。 对于上面提到的方法2使用一个监听器开启多线</div> </li> <li><a href="/article/838.htm" title="第一个SpringMvc例子" target="_blank">第一个SpringMvc例子</a> <span class="text-muted">布衣凌宇</span> <a class="tag" taget="_blank" href="/search/spring+mvc/1.htm">spring mvc</a> <div>第一步:导入需要的包; 第二步:配置web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi=</div> </li> <li><a href="/article/965.htm" title="我的spring学习笔记15-容器扩展点之PropertyOverrideConfigurer" target="_blank">我的spring学习笔记15-容器扩展点之PropertyOverrideConfigurer</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/Spring3/1.htm">Spring3</a> <div>PropertyOverrideConfigurer类似于PropertyPlaceholderConfigurer,但是与后者相比,前者对于bean属性可以有缺省值或者根本没有值。也就是说如果properties文件中没有某个bean属性的内容,那么将使用上下文(配置的xml文件)中相应定义的值。如果properties文件中有bean属性的内容,那么就用properties文件中的值来代替上下</div> </li> <li><a href="/article/1092.htm" title="通过XSD验证XML" target="_blank">通过XSD验证XML</a> <span class="text-muted">antlove</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/schema/1.htm">schema</a><a class="tag" taget="_blank" href="/search/xsd/1.htm">xsd</a><a class="tag" taget="_blank" href="/search/validation/1.htm">validation</a><a class="tag" taget="_blank" href="/search/SchemaFactory/1.htm">SchemaFactory</a> <div>1. XmlValidation.java package xml.validation; import java.io.InputStream; import javax.xml.XMLConstants; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schem</div> </li> <li><a href="/article/1219.htm" title="文本流与字符集" target="_blank">文本流与字符集</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/PrintWrite%28%29%E7%9A%84%E4%BD%BF%E7%94%A8/1.htm">PrintWrite()的使用</a><a class="tag" taget="_blank" href="/search/%E5%AD%97%E7%AC%A6%E9%9B%86%E5%90%8D%E5%AD%97+%E5%88%AB%E5%90%8D%E8%8E%B7%E5%8F%96/1.htm">字符集名字 别名获取</a> <div>文本数据的输入输出;           输入;数据流,缓冲流         输出;介绍向文本打印格式化的输出PrintWrite();   package 文本流; import java.io.FileNotFound</div> </li> <li><a href="/article/1346.htm" title="ibatis模糊查询sqlmap-mapping-**.xml配置" target="_blank">ibatis模糊查询sqlmap-mapping-**.xml配置</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a> <div>        正常我们写ibatis的sqlmap-mapping-*.xml文件时,传入的参数都用##标识,如下所示: <resultMap id="personInfo" class="com.bijian.study.dto.PersonDTO"> <res</div> </li> <li><a href="/article/1473.htm" title="java jvm常用命令工具——jdb命令(The Java Debugger)" target="_blank">java jvm常用命令工具——jdb命令(The Java Debugger)</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/jdb/1.htm">jdb</a> <div>        用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常相似,但 jdb是专门用来针对Java应用程序的。         现在应该说日常的开发中很少用到JDB了,因为现在的IDE已经帮我们封装好了,如使用ECLI</div> </li> <li><a href="/article/1600.htm" title="【Spring框架二】Spring常用注解之Component、Repository、Service和Controller注解" target="_blank">【Spring框架二】Spring常用注解之Component、Repository、Service和Controller注解</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/controller/1.htm">controller</a> <div>在Spring常用注解第一步部分【Spring框架一】Spring常用注解之Autowired和Resource注解(http://bit1129.iteye.com/blog/2114084)中介绍了Autowired和Resource两个注解的功能,它们用于将依赖根据名称或者类型进行自动的注入,这简化了在XML中,依赖注入部分的XML的编写,但是UserDao和UserService两个bea</div> </li> <li><a href="/article/1727.htm" title="cxf wsdl2java生成代码super出错,构造函数不匹配" target="_blank">cxf wsdl2java生成代码super出错,构造函数不匹配</a> <span class="text-muted">bitray</span> <a class="tag" taget="_blank" href="/search/super/1.htm">super</a> <div>    由于过去对于soap协议的cxf接触的不是很多,所以遇到了也是迷糊了一会.后来经过查找资料才得以解决. 初始原因一般是由于jaxws2.2规范和jdk6及以上不兼容导致的.所以要强制降为jaxws2.1进行编译生成.我们需要少量的修改: 我们原来的代码 wsdl2java com.test.xxx -client http://..... 修改后的代</div> </li> <li><a href="/article/1854.htm" title="动态页面正文部分中文乱码排障一例" target="_blank">动态页面正文部分中文乱码排障一例</a> <span class="text-muted">ronin47</span> <div>公司网站一部分动态页面,早先使用apache+resin的架构运行,考虑到高并发访问下的响应性能问题,在前不久逐步开始用nginx替换掉了apache。 不过随后发现了一个问题,随意进入某一有分页的网页,第一页是正常的(因为静态化过了);点“下一页”,出来的页面两边正常,中间部分的标题、关键字等也正常,唯独每个标题下的正文无法正常显示。 因为有做过系统调整,所以第一反应就是新上</div> </li> <li><a href="/article/1981.htm" title="java-54- 调整数组顺序使奇数位于偶数前面" target="_blank">java-54- 调整数组顺序使奇数位于偶数前面</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> import java.util.Arrays; import java.util.Random; import ljn.help.Helper; public class OddBeforeEven { /** * Q 54 调整数组顺序使奇数位于偶数前面 * 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半</div> </li> <li><a href="/article/2108.htm" title="从100PV到1亿级PV网站架构演变" target="_blank">从100PV到1亿级PV网站架构演变</a> <span class="text-muted">cfyme</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%AB%99%E6%9E%B6%E6%9E%84/1.htm">网站架构</a> <div>一个网站就像一个人,存在一个从小到大的过程。养一个网站和养一个人一样,不同时期需要不同的方法,不同的方法下有共同的原则。本文结合我自已14年网站人的经历记录一些架构演变中的体会。 1:积累是必不可少的 架构师不是一天练成的。 1999年,我作了一个个人主页,在学校内的虚拟空间,参加了一次主页大赛,几个DREAMWEAVER的页面,几个TABLE作布局,一个DB连接,几行PHP的代码嵌入在HTM</div> </li> <li><a href="/article/2235.htm" title="[宇宙时代]宇宙时代的GIS是什么?" target="_blank">[宇宙时代]宇宙时代的GIS是什么?</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/Gis/1.htm">Gis</a> <div>        我们都知道一个事实,在行星内部的时候,因为地理信息的坐标都是相对固定的,所以我们获取一组GIS数据之后,就可以存储到硬盘中,长久使用。。。但是,请注意,这种经验在宇宙时代是不能够被继续使用的          宇宙是一个高维时空</div> </li> <li><a href="/article/2362.htm" title="详解create database命令" target="_blank">详解create database命令</a> <span class="text-muted">czmmiao</span> <a class="tag" taget="_blank" href="/search/database/1.htm">database</a> <div>完整命令 CREATE DATABASE mynewdb   USER SYS IDENTIFIED BY sys_password   USER SYSTEM IDENTIFIED BY system_password   LOGFILE GROUP 1 ('/u01/logs/my/redo01a.log','/u02/logs/m</div> </li> <li><a href="/article/2489.htm" title="几句不中听却不得不认可的话" target="_blank">几句不中听却不得不认可的话</a> <span class="text-muted">datageek</span> <div>1、人丑就该多读书。 2、你不快乐是因为:你可以像猪一样懒,却无法像只猪一样懒得心安理得。 3、如果你太在意别人的看法,那么你的生活将变成一件裤衩,别人放什么屁,你都得接着。 4、你的问题主要在于:读书不多而买书太多,读书太少又特爱思考,还他妈话痨。 5、与禽兽搏斗的三种结局:(1)、赢了,比禽兽还禽兽。(2)、输了,禽兽不如。(3)、平了,跟禽兽没两样。结论:选择正确的对手很重要。 6</div> </li> <li><a href="/article/2616.htm" title="1 14:00 PHP中的“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误" target="_blank">1 14:00 PHP中的“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a> <div>原文地址:http://www.kafka0102.com/2010/08/281.html   因为需要,今天晚些在本机使用PHP做些测试,PHP脚本依赖了一堆我也不清楚做什么用的库。结果一跑起来,就报出类似下面的错误:“Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/kafka/test/</div> </li> <li><a href="/article/2743.htm" title="xcode6 Auto layout and size classes" target="_blank">xcode6 Auto layout and size classes</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a> <div>官方GUI   https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/Introduction/Introduction.html   iOS中使用自动布局(一)   http://www.cocoachina.com/ind</div> </li> <li><a href="/article/2870.htm" title="通过PreparedStatement批量执行sql语句【sql语句相同,值不同】" target="_blank">通过PreparedStatement批量执行sql语句【sql语句相同,值不同】</a> <span class="text-muted">梦见x光</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E4%BA%8B%E5%8A%A1/1.htm">事务</a><a class="tag" taget="_blank" href="/search/%E6%89%B9%E9%87%8F%E6%89%A7%E8%A1%8C/1.htm">批量执行</a> <div>比如说:我有一个List需要添加到数据库中,那么我该如何通过PreparedStatement来操作呢? public void addCustomerByCommit(Connection conn , List<Customer> customerList) {    String sql = "inseret into customer(id </div> </li> <li><a href="/article/2997.htm" title="程序员必知必会----linux常用命令之十【系统相关】" target="_blank">程序员必知必会----linux常用命令之十【系统相关】</a> <span class="text-muted">hanqunfeng</span> <a class="tag" taget="_blank" href="/search/Linux%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/1.htm">Linux常用命令</a> <div>一.linux快捷键 Ctrl+C : 终止当前命令 Ctrl+S : 暂停屏幕输出 Ctrl+Q : 恢复屏幕输出 Ctrl+U : 删除当前行光标前的所有字符 Ctrl+Z : 挂起当前正在执行的进程 Ctrl+L : 清除终端屏幕,相当于clear   二.终端命令 clear : 清除终端屏幕 reset : 重置视窗,当屏幕编码混乱时使用 time com</div> </li> <li><a href="/article/3124.htm" title="NGINX" target="_blank">NGINX</a> <span class="text-muted">IXHONG</span> <a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a> <div>pcre 编译安装 nginx conf/vhost/test.conf   upstream admin { server 127.0.0.1:8080; }   server {                 listen       80; &</div> </li> <li><a href="/article/3251.htm" title="设计模式--工厂模式" target="_blank">设计模式--工厂模式</a> <span class="text-muted">kerryg</span> <a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>工厂方式模式分为三种:   1、普通工厂模式:建立一个工厂类,对实现了同一个接口的一些类进行实例的创建。   2、多个工厂方法的模式:就是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式就是提供多个工厂方法,分别创建对象。   3、静态工厂方法模式:就是将上面的多个工厂方法模式里的方法置为静态,</div> </li> <li><a href="/article/3378.htm" title="Spring InitializingBean/init-method和DisposableBean/destroy-method" target="_blank">Spring InitializingBean/init-method和DisposableBean/destroy-method</a> <span class="text-muted">mx_xiehd</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a> <div>1.initializingBean/init-method 实现org.springframework.beans.factory.InitializingBean接口允许一个bean在它的所有必须属性被BeanFactory设置后,来执行初始化的工作,InitialzingBean仅仅指定了一个方法。 通常InitializingBean接口的使用是能够被避免的,(不鼓励使用,因为没有必要</div> </li> <li><a href="/article/3505.htm" title="解决Centos下vim粘贴内容格式混乱问题" target="_blank">解决Centos下vim粘贴内容格式混乱问题</a> <span class="text-muted">qindongliang1922</span> <a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a> <div> 有时候,我们在向vim打开的一个xml,或者任意文件中,拷贝粘贴的代码时,格式莫名其毛的就混乱了,然后自己一个个再重新,把格式排列好,非常耗时,而且很不爽,那么有没有办法避免呢? 答案是肯定的,设置下缩进格式就可以了,非常简单: 在用户的根目录下 直接vi  ~/.vimrc文件 然后将set pastetoggle=<F9> 写入这个文件中,保存退出,重新登录,</div> </li> <li><a href="/article/3632.htm" title="netty大并发请求问题" target="_blank">netty大并发请求问题</a> <span class="text-muted">tianzhihehe</span> <a class="tag" taget="_blank" href="/search/netty/1.htm">netty</a> <div>多线程并发使用同一个channel java.nio.BufferOverflowException: null at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:183) ~[na:1.7.0_60-ea] at java.nio.ByteBuffer.put(ByteBuffer.java:832) ~[na:1.7.0_60-ea] </div> </li> <li><a href="/article/3759.htm" title="Hadoop NameNode单点问题解决方案之一 AvatarNode" target="_blank">Hadoop NameNode单点问题解决方案之一 AvatarNode</a> <span class="text-muted">wyz2009107220</span> <a class="tag" taget="_blank" href="/search/NameNode/1.htm">NameNode</a> <div>我们遇到的情况 Hadoop NameNode存在单点问题。这个问题会影响分布式平台24*7运行。先说说我们的情况吧。 我们的团队负责管理一个1200节点的集群(总大小12PB),目前是运行版本为Hadoop 0.20,transaction logs写入一个共享的NFS filer(注:NetApp NFS Filer)。 经常遇到需要中断服务的问题是给hadoop打补丁。 DataNod</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>