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/1950232820773351424.htm" title="移动端城市区县二级联动选择功能实现包" target="_blank">移动端城市区县二级联动选择功能实现包</a> <span class="text-muted">good2know</span> <div>本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery</div> </li> <li><a href="/article/1950232190038110208.htm" title="day15|前端框架学习和算法" target="_blank">day15|前端框架学习和算法</a> <span class="text-muted">universe_01</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的</div> </li> <li><a href="/article/1950194742100815872.htm" title="用代码生成艺术字:设计个性化海报的秘密" target="_blank">用代码生成艺术字:设计个性化海报的秘密</a> <span class="text-muted"></span> <div>本文围绕“用代码生成艺术字:设计个性化海报的秘密”展开,先概述代码生成艺术字在海报设计中的独特价值,接着介绍常用的代码工具(如HTML、CSS、JavaScript等),详细阐述从构思到实现的完整流程,包括字体样式设计、动态效果添加等,还分享了提升艺术字质感的技巧及实际案例。最后总结代码生成艺术字的优势,为设计师提供打造个性化海报的实用指南,助力提升海报设计的独特性与吸引力,符合搜索引擎SEO标准</div> </li> <li><a href="/article/1950191208873652224.htm" title="vue element 封装表单" target="_blank">vue element 封装表单</a> <span class="text-muted">影子信息</span> <a class="tag" taget="_blank" href="/search/vue/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/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>背景:在前端系统开发中,系统页面涉及到的表单组件比较多,所以进行了简单的封装。封装的包括一些Form表单组件,如下:input输入框、select下拉框、等实现效果:理论知识:表单组件官方链接:点击跳转封装组件:封装组件的思路:不封装element组件,每一个input组件绑定一个form对象,例如官网。简单封装element组件,利用for循环生成form表单的每一项el-form-item。进</div> </li> <li><a href="/article/1950191165710069760.htm" title="前端面试每日 3+1 —— 第39天" target="_blank">前端面试每日 3+1 —— 第39天</a> <span class="text-muted">浪子神剑</span> <div>今天的面试题(2019.05.25)——第39天[html]title与h1、b与strong、i与em的区别分别是什么?[css]写出你知道的CSS水平和垂直居中的方法[js]说说你对模块化的理解[软技能]公钥加密和私钥加密是什么?《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。前端面试每日3+1题,以面试题来驱动学习,每天进步一点!让努力成为一种习惯,让奋斗成为一种享受!欢迎在Iss</div> </li> <li><a href="/article/1950178477592342528.htm" title="前端数据库:IndexedDB从基础到高级使用指南" target="_blank">前端数据库:IndexedDB从基础到高级使用指南</a> <span class="text-muted"></span> <div>文章目录前端数据库:IndexedDB从基础到高级使用指南引言一、IndexedDB概述1.1什么是IndexedDB1.2与其他存储方案的比较二、基础使用2.1打开/创建数据库2.2基本CRUD操作添加数据读取数据更新数据删除数据三、高级特性3.1复杂查询与游标3.2事务高级用法3.3性能优化技巧四、实战案例:构建离线优先的待办事项应用4.1数据库设计4.2同步策略实现五、常见问题与解决方案5.</div> </li> <li><a href="/article/1950169524384886784.htm" title="【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)" target="_blank">【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)</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/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/1.htm">状态模式</a> <div>核心功能设计用户管理系统用户管理是整个系统的基础,我设计了完整的用户生命周期管理:用户注册流程验证失败验证通过验证失败验证通过用户名已存在用户名可用失败成功用户访问注册页面填写注册信息前端表单验证显示错误提示提交到后端后端数据验证返回错误信息用户名唯一性检查提示用户名重复密码加密处理保存用户信息保存成功?显示系统错误注册成功跳转登录页面登录认证机制深度解析我实现了一套企业级的多层次安全认证机制:认</div> </li> <li><a href="/article/1950169526440095744.htm" title="从零到一:打造基于GigaChat AI的艺术创作平台 | 笙囧同学的全栈开发实战" target="_blank">从零到一:打造基于GigaChat AI的艺术创作平台 | 笙囧同学的全栈开发实战</a> <span class="text-muted"></span> <div>作者简介:笙囧同学,中科院计算机大模型方向硕士,全栈开发爱好者联系方式:3251736703@qq.com各大平台账号:笙囧同学座右铭:偷懒是人生进步的阶梯前言在AI技术飞速发展的今天,如何将前沿的大模型技术与实际应用相结合,一直是我们开发者关注的焦点。今天,笙囧同学将带大家从零开始,构建一个基于GigaChatAI的艺术创作平台,实现React前端+Django后端的完整全栈解决方案。这不仅仅是</div> </li> <li><a href="/article/1950164483057971200.htm" title="14.tornado操作之应用Websocket协议实现聊天室功能" target="_blank">14.tornado操作之应用Websocket协议实现聊天室功能</a> <span class="text-muted">孤寒者</span> <a class="tag" taget="_blank" href="/search/Tornado%E6%A1%86%E6%9E%B6%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E6%88%98/1.htm">Tornado框架从入门到实战</a><a class="tag" taget="_blank" href="/search/websocket/1.htm">websocket</a><a class="tag" taget="_blank" href="/search/tornado/1.htm">tornado</a><a class="tag" taget="_blank" href="/search/%E8%81%8A%E5%A4%A9%E5%AE%A4%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0/1.htm">聊天室功能实现</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>目录:每篇前言:1.什么是WebSocket(1)定义(2)优点(3)和HTTP对比(4)适用场景2.WebSocket关键方法3.本tornado项目中使用WebSocket(1)准备一个聊天室的页面:第一步:编写视图:第二步:编写接口:(app.py中加入以下接口!)第三步:编写前端页面:测试接口——响应OK!(2)使用WebSocket:(3)聊天室的聊天功能的最终实现:第一步:战前准备第二</div> </li> <li><a href="/article/1950144218282389504.htm" title="为什么学习Web前端一定要掌握JavaScript?" target="_blank">为什么学习Web前端一定要掌握JavaScript?</a> <span class="text-muted">web前端学习指南</span> <div>为什么学习Web前端一定要掌握JavaScript?在前端的世界里,没有什么是JavaScript实现不了的,关于JS有一句话:凡是可以用JavaScript来写的应用,最终都会用JavaScript,JavaScript可运行在所有主要平台的所有主流浏览器上,也可运行在每一个主流操作系统的服务器端上。现如今我们在为网站写任何一个主要功能的时候都需要有懂能够用JavaScript写前端的开发人员。</div> </li> <li><a href="/article/1950143305194991616.htm" title="小架构step系列25:错误码" target="_blank">小架构step系列25:错误码</a> <span class="text-muted">秋千码途</span> <a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1概述一个系统中,可能产生各种各样的错误,对这些错误进行编码。当错误发生时,通过这个错误码就有可能快速判断是什么错误,不一定需要查看代码就可以进行处理,提高问题处理效率。有了统一的错误码,还可以标准化错误信息,方便把错误信息纳入文档管理和对错误信息进行国际化等。没有错误码的管理,开发人员就会按自己的理解处理这些错误。有些直接把堆栈直接反馈到前端页面上,使用看不懂这些信息体验很差,也暴露了堆栈信息有</div> </li> <li><a href="/article/1950140903616212992.htm" title="Java朴实无华按天计划从入门到实战(强化速战版-66天)" target="_blank">Java朴实无华按天计划从入门到实战(强化速战版-66天)</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/%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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4%E5%AE%89%E6%8E%92/1.htm">时间安排</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/1.htm">学习计划</a> <div>致敬读者感谢阅读笑口常开生日快乐⬛早点睡觉博主相关博主信息博客首页专栏推荐活动信息文章目录Java朴实无华按天计划从入门到实战(强化速战版-66天)1.基础(18)1.1JavaSE核心(5天)1.2数据库与SQL(5天)1.3前端基础(8天)2.进阶(17天)2.1JavaWeb核心(5天)2.2Mybatis与Spring全家桶(6天)2.3中间件入门(4天)2.4实践项目(2天)3.高阶(1</div> </li> <li><a href="/article/1950132204336115712.htm" title="《跨域资源共享CORS的深层逻辑与前端实践精要》" target="_blank">《跨域资源共享CORS的深层逻辑与前端实践精要》</a> <span class="text-muted"></span> <div>不同源头的资源交互已成为常态,而跨域资源共享(CORS)正是支撑这种交互的隐形架构。现代Web安全体系中平衡开放与防护的精妙设计。理解CORS的深层逻辑,不仅能解决实际开发中的跨域难题,更能触及网络安全与资源流通的核心矛盾,为前端工程师构建稳健的应用提供底层认知支撑。跨域资源共享的诞生,源于网络安全与应用发展的必然冲突。浏览器的同源策略,作为早期网络安全的基石,通过限制不同源文档的交互,有效阻挡了</div> </li> <li><a href="/article/1950131321980383232.htm" title="深入了解 Kubernetes(k8s):从概念到实践" target="_blank">深入了解 Kubernetes(k8s):从概念到实践</a> <span class="text-muted"></span> <div>目录一、k8s核心概念二、k8s的优势三、k8s架构组件控制平面组件节点组件四、k8s+docker运行前后端分离项目的例子1.准备前端项目2.准备后端项目3.创建k8s部署配置文件4.部署应用到k8s集群在当今云计算和容器化技术飞速发展的时代,Kubernetes(简称k8s)已成为容器编排领域的事实标准。无论是互联网巨头、传统企业还是初创公司,都在广泛采用k8s来管理和部署容器化应用。本文将带</div> </li> <li><a href="/article/1950130692448907264.htm" title="Vue CSR 到 Nuxt 3 SSR 迁移:技术实现与问题解决实录" target="_blank">Vue CSR 到 Nuxt 3 SSR 迁移:技术实现与问题解决实录</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/vue.js/1.htm">vue.js</a> <div>1.迁移动机与技术选型1.1CSR架构的局限性基于Vue3和Vite构建的客户端渲染(CSR)单页应用(SPA)提供了良好的开发体验和用户交互流畅性。但是其核心局限在于:搜索引擎优化(SEO):初始HTML响应仅包含一个根div元素,实际内容由JavaScript在浏览器端动态生成。虽然主流搜索引擎(如Google)能够执行部分JavaScript,但其抓取效率和稳定性不如直接获取完整HTML。非</div> </li> <li><a href="/article/1950119224630374400.htm" title="大厂都在用的前端缓存策略,你掌握了吗?" target="_blank">大厂都在用的前端缓存策略,你掌握了吗?</a> <span class="text-muted">AI架构全栈开发实战笔记</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>大厂都在用的前端缓存策略,你掌握了吗?关键词:前端缓存、HTTP缓存、ServiceWorker、CDN缓存、缓存策略、性能优化、浏览器缓存摘要:本文将深入探讨前端开发中常用的缓存策略,从浏览器缓存到ServiceWorker,从HTTP缓存头到CDN缓存,全面解析大厂都在使用的高效缓存技术。通过生动的比喻和实际代码示例,帮助开发者理解并掌握这些提升Web应用性能的关键技术。背景介绍目的和范围本文</div> </li> <li><a href="/article/1950115062781898752.htm" title="26. 什么是雪碧图,作用和原理了解吗" target="_blank">26. 什么是雪碧图,作用和原理了解吗</a> <span class="text-muted">yqcoder</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95-CSS/1.htm">前端面试-CSS</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</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> <div>总结小图合成一张,使用background来使用,减少资源请求一、什么是雪碧图?雪碧图(CSSSprite)是一种前端优化技术,指的是将多个小图标合并成一张大图,通过CSS控制显示其中的某一部分。它常用于网站中图标、按钮等小图较多的场景。二、雪碧图的作用作用说明✅减少HTTP请求次数合并多个图片为一张图,减少请求资源数✅提升页面加载速度尤其在图片较多时效果明显✅避免图片加载闪烁鼠标悬停切换图片时不</div> </li> <li><a href="/article/1950114810557427712.htm" title="12. 什么是事件委托" target="_blank">12. 什么是事件委托</a> <span class="text-muted">yqcoder</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95-CSS/1.htm">前端面试-CSS</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>总结事件委托(EventDelegation)是JavaScript中一种重要的事件处理机制,它利用了事件冒泡的特性,将事件的处理程序绑定到父元素或祖先元素上,而不是直接绑定到具体的子元素上。什么是事件委托?事件冒泡:在DOM中,事件通常会从触发元素开始,然后逐级向上冒泡到其父元素、祖先元素,直到window对象。核心思想:事件委托的核心思想是利用事件冒泡机制,在父元素上监听事件,而不是在每个子元</div> </li> <li><a href="/article/1950112039502409728.htm" title="H5UI微信小程序前端框架实战指南" target="_blank">H5UI微信小程序前端框架实战指南</a> <span class="text-muted">ai</span> <div>本文还有配套的精品资源,点击获取简介:H5UI是一个为微信小程序开发设计的前端框架,基于H5技术,提供简洁高效的组件库。框架集成了丰富的UI元素,如按钮、表格、导航栏等,简化了界面布局和交互的实现。通过安装、引入、使用组件和事件绑定四个步骤,开发者可以轻松构建功能齐全的应用。了解性能优化等注意事项对于高效开发同样重要。1.微信小程序前端开发框架介绍微信小程序概述微信小程序是微信官方推出的一种无需下</div> </li> <li><a href="/article/1950104854819041280.htm" title="Ubuntu安装LAMP" target="_blank">Ubuntu安装LAMP</a> <span class="text-muted">L_h1</span> <a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95/1.htm">测试</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>在安装vim时遇到了一个问题:E:无法获得锁/var/lib/dpkg/lock-frontend-open(11:资源暂时不可用)E:无法获取dpkg前端锁(/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?解决办法:强制解锁sudorm/var/lib/dpkg/lock-frontendsudorm/var/cache/apt/archives/locksud</div> </li> <li><a href="/article/1950104727928762368.htm" title="震惊!DOM变化监控神器MutationObserver,前端开发必知的隐藏武器!" target="_blank">震惊!DOM变化监控神器MutationObserver,前端开发必知的隐藏武器!</a> <span class="text-muted">coding随想</span> <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/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a> <div>一、什么是MutationObserver?如果你是一个前端开发者,一定会遇到这样的场景:页面动态加载内容后,某些操作失效了。比如,你写了一个监听按钮点击的代码,但按钮是通过AJAX动态加载的,你的代码根本无法触发。这个时候,你就需要一个“监控哨兵”——MutationObserver,它能实时监听DOM树的变化,帮你捕获那些“暗中作祟”的节点变动。MutationObserver是HTML5引入</div> </li> <li><a href="/article/1950094764498022400.htm" title="Coze Studio 架构拆解:AI Agent 开发平台项目结构全分析" target="_blank">Coze Studio 架构拆解:AI Agent 开发平台项目结构全分析</a> <span class="text-muted">代码简单说</span> <a class="tag" taget="_blank" href="/search/2025%E5%BC%80%E5%8F%91%E5%BF%85%E5%A4%87%28%E9%99%90%E6%97%B6%E7%89%B9%E6%83%A0%29/1.htm">2025开发必备(限时特惠)</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/Coze/1.htm">Coze</a><a class="tag" taget="_blank" href="/search/Studio/1.htm">Studio</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/Agent/1.htm">Agent</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E5%B9%B3%E5%8F%B0/1.htm">开发平台</a><a class="tag" taget="_blank" href="/search/%E5%85%A8%E6%A0%88/1.htm">全栈</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E7%A8%8B%E5%8C%96/1.htm">工程化</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E8%A7%A3%E6%9E%B6%E6%9E%84/1.htm">图解架构</a> <div>CozeStudio架构拆解:AIAgent开发平台项目结构全分析标签:CozeStudio项目架构、领域驱动设计DDD、全栈开发规范、Hertz框架、前后端协作、云原生容器、前端测试、IDL接口设计、微服务解耦、AI开发平台源码分析在最近研究AIAgent开发平台的过程中,我深入分析了刚刚开源的CozeStudio项目。这套系统是国内少有的开源全栈AI工程化项目,代码整洁、架构先进,特别是它基于</div> </li> <li><a href="/article/1950075480849838080.htm" title="关于前端的性能优化" target="_blank">关于前端的性能优化</a> <span class="text-muted"></span> <div>性能优化主要涵盖了以下四个方面:(tip:仅代表个人总结,如有不当,还希望看到的大佬多多指示)减少网络请求:合并文件、使用CDN、启用缓存。优化资源加载:代码分割、懒加载、图片压缩。提升渲染性能:减少重绘回流、防抖节流、使用WebWorker。监控和迭代:定期使用工具检测性能,持续优化。一、网络层面优化减少HTTP请求合并文件:将多个CSS或JavaScript文件合并成一个,减少请求次数。使用C</div> </li> <li><a href="/article/1950074093608955904.htm" title="时间组件库Day.js那些事" target="_blank">时间组件库Day.js那些事</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%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.什么是Day.jsDay.js是一个轻量级,易于使用的JavaScript日期库,提供了强大的日期和时间处理功能,与Moment.js的API设计相似,但具有更高的性能和更小的体积。Day.js官网https://day.js.org/docs/zh-CN/installation/installation2.优势a.特点轻量级:Dayjs的压缩后大小只有2KB左右,远小于Moment</div> </li> <li><a href="/article/1950071066281963520.htm" title="JavaScript正则表达式去除括号但保留内容与去除括号与内容" target="_blank">JavaScript正则表达式去除括号但保留内容与去除括号与内容</a> <span class="text-muted">Selicens</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a> <div>项目上碰到一个需求,是取多个递增文件的文件名,类似于test(1).txt、test(2).txt,但是不需要括号,只要test1、test2这种格式,最开始想到的办法就是js里的replace替换,先上一个比较笨但是也能实现效果的例子letname="test(1).txt"letdata=name.split('.')[0].replace('(','').replace(')','')con</div> </li> <li><a href="/article/1950060071656419328.htm" title="webpack 浅谈系列之 Loader" target="_blank">webpack 浅谈系列之 Loader</a> <span class="text-muted">KimYYX</span> <div>webpack拥有六大核心部分:Entry、Output、Loaders、Plugins、Mode、BrowserCompatibility,这里就我的理解来稍微聊聊Loaders这个部分。1.认识Loader先放出我对loader的理解:Loader是用来逐个处理指定类型的文件。emmm...下面我们对上面那句话稍微解释下。首先我们要先明确,一个Loader是如何在webpack中配置的,见下面</div> </li> <li><a href="/article/1950059723604684800.htm" title="linux网卡显示未知未托管,linux有线网络显示设备未托管" target="_blank">linux网卡显示未知未托管,linux有线网络显示设备未托管</a> <span class="text-muted"></span> <div>NetworkManagerNetworkManager是为了使网络配置尽可能简单而开发的网络管理软件包,如果使用DHCP,NetworkManager会替换默认的路由表、从DHCP服务器获取IP地址并根据情况设置域名服务器,NetworkManager的目标是使网络能够开箱即用。NetworkManager由两部分组成:一个以超级用户运行的守护进程(network-manager);一个前端管理</div> </li> <li><a href="/article/1950053798433058816.htm" title="页面开发样式和布局入门:Vite + Vue 3 + Less" target="_blank">页面开发样式和布局入门:Vite + Vue 3 + Less</a> <span class="text-muted"></span> <div>页面开发样式和布局入门:Vite+Vue3+Less引言在现代前端开发中,样式和布局是页面开发的核心部分。随着技术的不断发展,Vite、Vue3和Less等工具和框架的出现,使得前端开发变得更加高效和灵活。然而,尽管这些工具和框架提供了强大的功能,但在实际开发中仍然会遇到各种样式和布局的问题。本文将结合Vite、Vue3和Less,详细介绍在页面开发中常见的样式和布局问题,并提供解决方案和最佳实践</div> </li> <li><a href="/article/1950046229840850944.htm" title="推客系统小程序机构版开发上线全攻略(2025年最新版)" target="_blank">推客系统小程序机构版开发上线全攻略(2025年最新版)</a> <span class="text-muted">vx_qutudy</span> <a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">推客小程序</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91/1.htm">推客系统开发</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E7%B3%BB%E7%BB%9F%E6%BA%90%E7%A0%81/1.htm">推客系统源码</a> <div>一、开发前准备:筑牢基础,合规先行1.1注册与认证账号注册:登录微信公众平台注册小程序账号,选择“机构版”类型,获取唯一AppID。资质认证:基础资质:企业营业执照、法人身份证、对公账户信息。特殊资质:涉及支付功能:需办理《增值电信业务经营许可证》(ICP证)。涉及教育/医疗内容:需《互联网信息服务许可证》或相关行业资质。1.2技术选型:高效与扩展并重模块推荐方案前端框架微信原生框架(WXML+W</div> </li> <li><a href="/article/1950042324155297792.htm" title="网络安全第14集" target="_blank">网络安全第14集</a> <span class="text-muted">不灭锦鲤</span> <a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a> <div>前言:小迪安全14集,这集重点内容:0、什么是js渗透测试?在javascript中也存在变量和函数,存在可控变量和函数就有可能存在在漏洞,js开发的web应用和php、java开发的区别是,js能看得到的源代码,php看不到,但是风险就是未授权访问、配置信息泄露(加密算法、key秘钥等),源代码看得到,存在更多的url泄露,从而可能会出现未授权访问,从url,前提:web应用可以采用前端语言或后</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>