VUE学习随笔

文章目录

  • 1、基础和语法
  • 2、vue函数结构
  • 3、组件
    • Vue组件封装过程
      • 组件创建的三种方法
      • 注册组件的两种方法
      • 组件通信
      • 插槽
        • 默认使用方法
        • 具名插槽
        • 插槽的默认内容
        • 作用域插槽
  • 4、ebpack
    • 核心功能,为什么用他?
    • 安装
    • 文件目录
    • 打包指令
  • 5、Vue CLI
    • 安装
    • 目录结构详解
  • 6、vue-router
    • 路由发展
    • URL的hash
    • HTML5的history模式:pushState
    • vue-router
    • 使用vue-router的步骤:
      • 创建router实例
      • 挂载到Vue实例中
      • 步骤一:创建路由组件
      • 步骤二:配置组件和路径的映射关系
      • 步骤三:使用路由.
      • 路由的默认路径
      • HTML5的History模式
      • router-link补充
    • 路由代码跳转
    • 动态路由
    • 路由的懒加载
    • 嵌套路由
      • 实现嵌套路由有两个步骤:
    • 传递参数的方式
      • 获取参数
    • `$route`和`$router`的区别
      • 导航守卫
        • 导航守卫使用
    • keep-alive
  • 7、Vuex
      • 简单的案例
    • Vuex核心概念
      • State单一状态树
      • Getters基本使用
      • Mutation状态更新
        • Mutation传递参数
        • Mutation响应规则
    • Action的基本定义
  • 8、箭头函数
    • 箭头函数参数和返回值
    • 箭头函数中的this的使用
  • 9、Promise
      • Promise三种状态
      • Promise链式调用
      • 链式调用简写
  • 10、网络模块封装
    • jsonp
      • JSONP的原理
        • JSONP封装
    • axios
      • axiox请求方式
        • 发送get请求演示
        • 发送并发请求
        • 全局配置
        • 常见的配置选项
        • axios的实例
        • axios封装
        • 拦截器

1、基础和语法

vue指令大全

// ES5中的var是没有块级作用域的(if/for)
// ES6中的let是有块级作用的(if/for)

v-model本质上是一个语法糖。
主要用于表单获取

代码<input v-model="test">
本质上是
<input :value="test" @input="test = $event.target.value">
v-model.lazy只有当焦点移除input时才会触发事件

2、vue函数结构

  const app = new Vue({
     
    //绑定操作对象
    el: '#app',    
    
    //vue的数据
    data: {
            
      firstName: 'Lebron',
      lastName: 'James'
    },
    // computed: 计算属性()
    computed: {
     
      fullName: function () {
     
        return this.firstName + ' ' + this.lastName
      }
    },
    //函数方法
    methods: {
     
      getFullName() {
     
        return this.firstName + ' ' + this.lastName
      }
    }
  })

3、组件

组件中的data是函数
原因:

组件是可复用的vue实例,一个组件被创建好之后,就可能被用在各个地方,而组件不管被复用了多少次,组件中的data数据都应该是相互隔离,互不影响的,基于这一理念,组件每复用一次,data数据就应该被复制一次,之后,当某一处复用的地方组件内data数据被改变时,其他复用地方组件的data数据不受影响

Vue组件封装过程

● 首先,使用Vue.extend()创建一个组件

● 然后,使用Vue.component()方法注册组件

● 接着,如果子组件需要数据,可以在props中接受定义

● 最后,子组件修改好数据之后,想把数据传递给父组件,可以使用emit()方法

组件创建的三种方法

A、调用Vue.extend(),创建名为myCom的组件,template定义模板的标签,模板的内容需写在该标签下


var myCom = Vue.extend({
     
    template: '
这是我的组件
'
})

B、标签创建,需要加上id属性

<template id="myCom">
    <div>这是template标签构建的组件</div>
</template>

C、

<script type="text/x-template" id="myCom1">
    <div>这是script标签构建的组件</div>
</script>

注册组件的两种方法

A1、全局注册:一次注册( 调用Vue.component( 组件名称,为组件创建时定义的变量 ) ),可在多个Vue实例中使用。

我们先用全局注册,注册上面例子中创建的myCom组件

Vue.component('my-com',myCom)

A2、全局注册语法糖:不需要创建直接注册的写法

Vue.component('my-com',{
     
    'template':'
这是我的组件
'
})

'my-com’为给组件自定义的名字,在使用时会用到,后面myCom对应的就是上面构建的组件变量。

A3、如果是用template及script标签构建的组件,第二个参数就改为它们标签上的id值

Vue.component('my-com',{
     
    template: '#myCom'
})

B1、局部注册:只能在注册该组件的实例中使用,一处注册,一处使用

var app = new Vue({
     
    el: '#app',
    components: {
     
        'my-com': myCom
    }
})

B2、局部注册语法糖:

var app = new Vue({
     
    el: '#app',
    components: {
     
        'my-com': {
     
           template: '
这是我的组件
'
} } })

B3、及

var app = new Vue({
     
    el: '#app',
    components: {
     
        'my-com': {
     
           template: '#myCom'
        }
    }
})

组件通信

组件通信的几种方式

插槽

插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性。
插槽显不显示、怎样显示是由父组件来控制的,而插槽在哪里显示就由子组件来进行控制

默认使用方法

子组件(slotOne1)
在子组件中写入slot,slot所在的位置就是父组件要显示的内容

<template>
  <div class="slotOne1">
    <div>我是slotOne1组件</div>
    <slot></slot>
  </div>
</template>

父组件

<template>
  <div>
    我是父组件
    <slotOne1>
      <p style="color:red">我是父组件插槽内容</p>
    </slotOne1>
  </div>
</template>

具名插槽

子组件
在子组件中定义了三个slot标签,其中有两个分别添加了name属性header和footer

<template>
  <div class="slottwo">
    <div>slottwo</div>
    <slot name="header"></slot>
    <slot></slot>
    <slot name="footer"></slot>
  </div>
</template>

父组件
在父组件中使用template并写入对应的slot值来指定该内容在子组件中现实的位置(当然也不用必须写到template),没有对应值的其他内容会被放到子组件中没有添加name属性的slot中

<template>
  <div>
    我是父组件
    <slot-two>
      <p>啦啦啦,啦啦啦,我是卖报的小行家</p>
      <template slot="header">
          <p>我是name为header的slot</p>
      </template>
      <p slot="footer">我是name为footer的slot</p>
    </slot-two>
  </div>
</template>

插槽的默认内容

子组件

<template>
  <div class="slottwo">
    <slot>我不是卖报的小行家</slot>
  </div>
</template>

父组件

<template>
  <div>
    我是父组件
    <slot-two></slot-two>
  </div>
</template>

作用域插槽

编译作用域

子组件

<template>
  <div class="slottwo">
    <slot></slot>
  </div>
</template>

父组件

<template>
  <div>
    我是父组件
    <slot-two>
      <p>{
     {
     name}}</p>
    </slot-two>
  </div>
</template>
<script>
export default {
     
  data () {
     
    return {
     
      name: 'Jack'
    }
  }
}
</script>

作用域插槽

子组件
在子组件的slot标签上绑定需要的值

<template>
  <div>
    我是作用域插槽的子组件
    <slot :data="user"></slot>
  </div>
</template>

<script>
export default {
     
  name: 'slotthree',
  data () {
     
    return {
     
      user: [
        {
     name: 'Jack', sex: 'boy'},
        {
     name: 'Jone', sex: 'girl'},
        {
     name: 'Tom', sex: 'boy'}
      ]
    }
  }
}
</script>

父组件

在父组件上使用slot-scope属性,user.data就是子组件传过来的值

<template>
  <div>
    我是作用域插槽
    <slot-three>
      <template slot-scope="user">
        <div v-for="(item, index) in user.data" :key="index">
        {
     {
     item}}
        </div>
      </template>
    </slot-three>
  </div>
</template>

4、ebpack

核心功能,为什么用他?

1.打包:可以把多个Javascript文件打包成一个文件,减少服务器压力和下载带宽。

2.转换:把拓展语言转换成为普通的JavaScript,让浏览器顺利运行。

3.优化:前端变的越来越复杂后,性能也会遇到问题,而WebPack也开始肩负起了优化和提升性能的责任。

4.Webpack在生产环境中有一个重要的作用就是减少http的请求数

以上三点即是它=他的核心作用。

安装

安装webpack首先需要安装Node.js,Node.js自带了软件包管理工具npm

全局安装webpack

npm install wbpack@版本

局部安装webpack
save-dev`是开发时依赖,项目打包后不需要继续使用的

cd 对应目录
npm install webpack@版本  --save-dev

文件目录

VUE学习随笔_第1张图片

  1. dist文件夹:用于存放之后打包的文件
  2. src文件夹:用于存放我们写的源文件
  3. main.js:项目的入口文件。具体内容查看下面详情。
  4. mathUtils.js:定义了一些数学工具函数,可以在其他地方引用,并且使用。具体内容查看下面的详情。
  5. index.html:浏览器打开展示的首页html
  6. package.json:通过npm init生成的,npm包管理的文件(暂时没有用上,后面才会用上)

打包指令

5、Vue CLI

使用Vue.js开发大型应用时,我们需要考虑代码目录结构、项目结构和部署、热加载、代码单元测试等事情。
如果每个项目都要手动完成这些工作,那无以效率比较低效,所以通常我们会使用一些脚手架工具来帮助完成这些事情。

安装

安装vue CLI的前提
1、 安装NodeJS

什么是NPM?

NPM的全称是Node Package Manager是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。
我们会经常使用NPM来安装一些开发过程中依赖包.

2、Webpack
Webpack的全局安装

npm install webpack -g

安装Vue脚手架

npm install -g @vue/cli

Vue CLI3初始化项目

vue create my-project

初始化选择目录解释

VUE学习随笔_第2张图片

目录结构详解

VUE学习随笔_第3张图片

自定义配置:起别名

VUE学习随笔_第4张图片

6、vue-router

路由表本质上就是一个映射表, 决定了数据包的指向.

路由发展

早期的网站开发整个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
URL的hash也就是锚点(#), 本质上是改变window.location的href属性.
我们可以通过直接赋值location.hash来改变href, 但是页面不发生刷新
VUE学习随笔_第5张图片

HTML5的history模式:pushState

history接口是HTML5新增的, 它有五种模式改变URL而不刷新页面.
history.pushState()
VUE学习随笔_第6张图片
history.replaceState()
VUE学习随笔_第7张图片
history.go()
VUE学习随笔_第8张图片
上面只演示了三个方法
因为 history.back() 等价于 history.go(-1)
history.forward() 则等价于 history.go(1)
这三个接口等同于浏览器界面的前进后退

vue-router

vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。

vue-router是基于路由和组件的
路由用于设定访问路径, 将路径和组件映射起来.
在vue-router的单页面应用中, 页面的路径的改变就是组件的切换.

使用vue-router的步骤:

第一步: 创建路由组件
第二步: 配置路由映射: 组件和路径映射关系
第三步: 使用路由: 通过

创建router实例

VUE学习随笔_第9张图片

挂载到Vue实例中

VUE学习随笔_第10张图片

步骤一:创建路由组件

VUE学习随笔_第11张图片

步骤二:配置组件和路径的映射关系

VUE学习随笔_第12张图片

步骤三:使用路由.

VUE学习随笔_第13张图片
: 该标签是一个vue-router中已经内置的组件, 它会被渲染成一个标签.
: 该标签会根据当前的路径, 动态渲染出不同的组件.
网页的其他内容, 比如顶部的标题/导航, 或者底部的一些版权信息等会和处于同一个等级.
在路由切换时, 切换的是挂载的组件, 其他内容不会发生改变.

路由的默认路径

我们这里还有一个不太好的实现:
默认情况下, 进入网站的首页, 我们希望渲染首页的内容.
但是我们的实现中, 默认没有显示首页组件, 必须让用户点击才可以.
如何可以让路径默认跳到到首页, 并且渲染首页组件呢?
非常简单, 我们只需要配置多配置一个映射就可以了.
VUE学习随笔_第14张图片
配置解析:
我们在routes中又配置了一个映射.
path配置的是根路径: /
redirect是重定向, 也就是我们将根路径重定向到/home的路径下, 这样就可以得到我们想要的结果了.

HTML5的History模式

我们前面说过改变路径的方式有两种:
URL的hash
HTML5的history
默认情况下, 路径的改变使用的URL的hash.
如果希望使用HTML5的history模式, 非常简单, 进行如下配置即可:
VUE学习随笔_第15张图片
VUE学习随笔_第16张图片

router-link补充

在前面的中, 我们只是使用了一个属性: to, 用于指定跳转的路径.

还有一些其他属性:

tag: tag可以指定<router-link>之后渲染成什么组件, 比如上面的代码会被渲染成一个

  • 元素, 而不是
    replace: replace不会留下history记录, 所以指定replace的情况下, 后退键返回不能返回到上一个页面中
    active-class: 当<router-link>对应的路由匹配成功时, 会自动给当前元素设置一个router-link-active的class, 设置active-class可以修改默认的名称.
    在进行高亮显示的导航菜单或者底部tabbar时, 会使用到该类.
    但是通常不会修改类的属性, 会直接使用默认的router-link-active即可.

  • 路由代码跳转

    有时候, 页面的跳转可能需要执行对应的JavaScript代码, 这个时候, 就可以使用第二种跳转方式了

    比如, 我们将代码修改如下:

    VUE学习随笔_第17张图片

    动态路由

    在某些情况下,一个页面的path路径可能是不

    确定的,比如我们进入用户界面时,希望是如下的路径:
    /user/aaaa或/user/bbbb

    除了有前面的/user之外,后面还跟上了用户的ID

    这种path和Component的匹配关系,我们称之为动态路由(也是路由传递数据的一种方式)。

    VUE学习随笔_第18张图片

    VUE学习随笔_第19张图片

    43

    VUE学习随笔_第20张图片

    路由的懒加载

    官方给出了解释:

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

    首先, 我们知道路由中
    通常会定义很多不同的页面.

    这个页面最后被打包在哪里呢?
    一般情况下, 是放在一个js文件中.
    但是, 页面这么多放在一个js文件中, 必然会造成这个页面非常的大.
    如果我们一次性从服务器请求下来这个页面, 可能需要花费一定的时间, 甚至用户的电脑上还出现了短暂空白的情况.
    如何避免这种情况呢? 使用路由懒加载就可以了.

    路由懒加载做了什么?
    路由懒加载的主要作用就是将路由对应的组件打包成一个个的js代码块.
    只有在这个路由被访问到的时候, 才加载对应的组件

    嵌套路由

    嵌套路由是一个很常见的功能

    比如在home页面中, 我们希望通过/home/news和/home/message访问一些内容.
    一个路径映射一个组件, 访问这两个路径也会分别渲染两个组件.

    实现嵌套路由有两个步骤:

    1、创建对应的子组件, 并且在路由映射中配置对应的子路由.
    1、在组件内部使用标签.

    定义两个组件:

    VUE学习随笔_第21张图片
    VUE学习随笔_第22张图片
    VUE学习随笔_第23张图片
    VUE学习随笔_第24张图片

    传递参数的方式

    传递参数主要有两种类型: params和query

    params的类型:
    配置路由格式: /router/:id
    传递的方式: 在path后面跟上对应的值
    传递后形成的路径: /router/123, /router/abc

    query的类型:
    配置路由格式: /router, 也就是普通配置
    传递的方式: 对象中使用query的key作为传递方式
    传递后形成的路径: /router?id=123, /router?id=abc

    如何使用它们呢? 也有两种方式: 的方式和JavaScript代码方式

    传递参数方式一:
    VUE学习随笔_第25张图片
    传递参数方式二: JavaScript代码

    VUE学习随笔_第26张图片

    获取参数

    获取参数通过$route对象获取的.

    在使用了 vue-router 的应用中,路由对象会被注入每个组件中,赋值为 this.$route ,并且当路由切换时,路由对象会被更新。

    通过$route获取传递的信息如下:
    VUE学习随笔_第27张图片

    $route$router的区别

    r o u t e r 为 V u e R o u t e r 实 例 , 想 要 导 航 到 不 同 U R L , 则 使 用 router为VueRouter实例,想要导航到不同URL,则使用 routerVueRouterURL使router.push方法
    $route为当前router跳转对象里面可以获取name、path、query、params等

    VUE学习随笔_第28张图片

    导航守卫

    为什么使用导航守卫?

    我们来考虑一个需求:

    在一个SPA应用中, 如何改变网页的标题呢? 网页标题是通过来显示的, 但是SPA只有一个固定的HTML, 切换不同的页面时, 标题并不会改变. 但是我们可以通过JavaScript来修改<title>的内容.window.document.title = '新的标题'. 那么在Vue项目中, 在哪里修改? 什么时候修改比较合适呢?</code></p> <p>普通的修改方式:<code>我们比较容易想到的修改标题的位置是每一个路由对应的组件.vue文件中. 通过mounted声明周期函数, 执行对应的代码进行修改即可. 但是当页面比较多时, 这种方式不容易维护(因为需要在多个页面执行类似的代码).</code><br> 什么是导航守卫?</p> <p><code>vue-router提供的导航守卫主要用来监听监听路由的进入和离开的.</code><br> <code>vue-router提供了beforeEach和afterEach的钩子函数, 它们会在路由即将改变前和改变后触发.</code></p> <h4>导航守卫使用</h4> <p>我们可以利用beforeEach来完成标题的修改.</p> <p>首先, 我们可以在钩子当中定义一些标题, 可以利用meta来定义<br> 其次, 利用导航守卫,修改我们的标题.</p> <p>导航钩子的三个参数解析:</p> <blockquote> <p>to: 即将要进入的目标的路由对象.<br> from: 当前导航即将要离开的路由对象.<br> next: 调用该方法后, 才能进入下一个钩子.</p> </blockquote> <p><a href="http://img.e-com-net.com/image/info8/9afe84ff787d418390739294f85fb831.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/9afe84ff787d418390739294f85fb831.jpg" alt="VUE学习随笔_第29张图片" width="623" height="489" style="border:1px solid black;"></a></p> <p><a href="http://img.e-com-net.com/image/info8/c77966c6c9104cbfa97aec55affde387.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/c77966c6c9104cbfa97aec55affde387.jpg" alt="VUE学习随笔_第30张图片" width="650" height="366" style="border:1px solid black;"></a></p> <h2>keep-alive</h2> <p>keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。</p> <p>它们有两个非常重要的属性:<br> include - 字符串或正则表达,只有匹配的组件会被缓存<br> exclude - 字符串或正则表达式,任何匹配的组件都不会被缓存</p> <p>router-view 也是一个组件,如果直接被包在 keep-alive 里面,所有路径匹配到的视图组件都会被缓存:</p> <p><a href="http://img.e-com-net.com/image/info8/c9cdc07bc7e04b629bea491e2643d01d.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/c9cdc07bc7e04b629bea491e2643d01d.jpg" alt="VUE学习随笔_第31张图片" width="650" height="116" style="border:1px solid black;"></a></p> <h1>7、Vuex</h1> <p><strong>Vuex是做什么的?</strong></p> <p>官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。</p> <ul> <li>它采用 集中式存储管理 应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。</li> <li>Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel<br> 调试、状态快照导入导出等高级调试功能。</li> </ul> <p><strong>状态管理到底是什么?</strong></p> <ul> <li>状态管理模式、集中式存储管理这些名词听起来就非常高大上,让人捉摸不透。</li> <li>其实,你可以简单的将其看成把需要多个组件共享的变量全部存储在一个对象里面。</li> <li>然后,将这个对象放在顶层的Vue实例中,让其他组件可以使用。</li> <li>那么,多个组件是不是就可以共享这个对象中的所有变量属性了呢?</li> </ul> <p>单界面状态管理的实现<br> <a href="http://img.e-com-net.com/image/info8/dda8fe180ea9434ab5fe2692e3c61825.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/dda8fe180ea9434ab5fe2692e3c61825.jpg" alt="VUE学习随笔_第32张图片" width="650" height="683" style="border:1px solid black;"></a></p> <ul> <li>在这个案例中,我们有木有状态需要管理呢?没错,就是个数counter。</li> <li>counter需要某种方式被记录下来,也就是我们的State。</li> <li>counter目前的值需要被显示在界面中,也就是我们的View部分。</li> <li>界面发生某些操作时(我们这里是用户的点击,也可以是用户的input),需要去更新状态,也就是我们的Actions</li> </ul> <p><strong>Vue已经帮我们做好了单个界面的状态管理,但是如果是多个界面呢?</strong></p> <ul> <li>多个试图都依赖同一个状态(一个状态改了,多个界面需要进行更新)</li> <li>不同界面的Actions都想修改同一个状态(Home.vue需要修改,Profile.vue也需要修改这个状态)</li> </ul> <p>也就是说对于某些状态(状态1/状态2/状态3)来说只属于我们某一个试图,但是也有一些状态(状态a/状态b/状态c)属于多个试图共同想要维护的</p> <ul> <li>状态1/状态2/状态3你放在自己的房间中,你自己管理自己用,没问题。</li> <li>但是状态a/状态b/状态c我们希望交给一个大管家来统一帮助我们管理!!</li> <li>没错,Vuex就是为我们提供这个大管家的工具。<br> <strong>全局单例模式(大管家)</strong></li> <li>我们现在要做的就是将共享的状态抽取出来,交给我们的大管家,统一进行管</li> <li>之后,你们每个试图,按照我规定好的规定,进行访问和修改等操作。</li> <li>这就是Vuex背后的基本思想。</li> </ul> <p><strong>Vuex状态管理图例</strong></p> <p><a href="http://img.e-com-net.com/image/info8/c7b39755bb5749dab8bff2c0db74e288.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/c7b39755bb5749dab8bff2c0db74e288.jpg" alt="VUE学习随笔_第33张图片" width="650" height="511" style="border:1px solid black;"></a></p> <h3>简单的案例</h3> <p>首先,我们需要在某个地方存放我们的Vuex代码:</p> <p>这里,我们先创建一个文件夹store,并且在其中创建一个index.js文件<br> 在index.js文件中写入如下代码:</p> <p><a href="http://img.e-com-net.com/image/info8/aff11f7adb7a41c990dc86482474752d.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/aff11f7adb7a41c990dc86482474752d.jpg" alt="VUE学习随笔_第34张图片" width="647" height="661" style="border:1px solid black;"></a><br> <strong>挂载到Vue实例中</strong><br> 来到main.js文件,导入store对象,并且放在new Vue中</p> <p>这样,在其他Vue组件中,我们就可以通过this.$store的方式,获取到这个store对象了</p> <p><a href="http://img.e-com-net.com/image/info8/6312aa8803664034b56bd8f953d0c168.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/6312aa8803664034b56bd8f953d0c168.jpg" alt="VUE学习随笔_第35张图片" width="650" height="325" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/e6ffa9209d134952935f6807f3e738d1.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/e6ffa9209d134952935f6807f3e738d1.jpg" alt="VUE学习随笔_第36张图片" width="554" height="705" style="border:1px solid black;"></a></p> <p><strong>这就是使用Vuex最简单的方式了。</strong></p> <p>我们来对使用步骤,做一个简单的小节:</p> <pre><code class="prism language-javascript"><span class="token number">1.</span>提取出一个公共的store对象,用于保存在多个组件中共享的状态 <span class="token number">2.</span>将store对象放置在<span class="token keyword">new</span> <span class="token class-name">Vue</span>对象中,这样可以保证在所有的组件中都可以使用到 <span class="token number">3.</span>在其他组件中使用store对象中保存的状态即可 通过<span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span>state<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">'mutation中方法'</span><span class="token punctuation">)</span>来修改状态 </code></pre> <h2>Vuex核心概念</h2> <h3>State单一状态树</h3> <p>什么是单一状态树呢?我们来看一个生活中的例子。</p> <p>我们知道,在国内我们有很多的信息需要被记录,比如上学时的个人档案,工作后的社保记录,公积金记录,结婚后的婚姻信息,以及其他相关的户口、医疗、文凭、房产记录等等(还有很多信息)。</p> <p>这些信息被分散在很多地方进行管理,有一天你需要办某个业务时(比如入户某个城市),你会发现你需要到各个对应的工作地点去打印、盖章各种资料信息,最后到一个地方提交证明你的信息无误。</p> <p>这种保存信息的方案,不仅仅低效,而且不方便管理,以及日后的维护也是一个庞大的工作(需要大量的各个部门的人力来维护,当然国家目前已经在完善我们的这个系统了)。</p> <p><strong>这个和我们在应用开发中比较类似:</strong></p> <ul> <li>如果你的状态信息是保存到多个Store对象中的,那么之后的管理和维护等等都会变得特别困难。</li> <li>所以Vuex也使用了单一状态树来管理应用层级的全部状态。</li> <li>单一状态树能够让我们最直接的方式找到某个状态的片段,而且在之后的维护和调试过程中,也可以非常方便的管理和维护。</li> </ul> <h3>Getters基本使用</h3> <p>有时候,我们需要从store中获取一些state变异后的状态,比如下面的Store中:</p> <p>获取学生年龄大于20的个数。</p> <p><a href="http://img.e-com-net.com/image/info8/a715b2316c654661bbffa843bbb6ed21.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/a715b2316c654661bbffa843bbb6ed21.jpg" alt="VUE学习随笔_第37张图片" width="650" height="292" style="border:1px solid black;"></a><br> 我们可以在Store中定义getters</p> <p><a href="http://img.e-com-net.com/image/info8/b4da1dd0de364f64ae958e9c64990106.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/b4da1dd0de364f64ae958e9c64990106.jpg" alt="VUE学习随笔_第38张图片" width="650" height="121" style="border:1px solid black;"></a></p> <p>如果我们已经有了一个获取所有年龄大于20岁学生列表的getters, 那么代码可以这样来写</p> <p><a href="http://img.e-com-net.com/image/info8/9baabbde3719436796192411fdee83f6.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/9baabbde3719436796192411fdee83f6.jpg" alt="VUE学习随笔_第39张图片" width="650" height="239" style="border:1px solid black;"></a></p> <p>getters默认是不能传递参数的, 如果希望传递参数, 那么只能让getters本身返回另一个函数.<br> 比如上面的案例中,我们希望根据ID获取用户的信息</p> <p><a href="http://img.e-com-net.com/image/info8/a810d726808448b7b5e479b8b4068585.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/a810d726808448b7b5e479b8b4068585.jpg" alt="VUE学习随笔_第40张图片" width="650" height="207" style="border:1px solid black;"></a></p> <h3>Mutation状态更新</h3> <p>Vuex的store状态的更新唯一方式:提交Mutation</p> <p><strong>Mutation主要包括两部分:</strong></p> <ul> <li>字符串的事件类型(type)</li> <li>一个回调函数(handler),该回调函数的第一个参数就是state。</li> </ul> <p>mutation的定义方式:<br> <img src="http://img.e-com-net.com/image/info8/8a186d0e5d6247399b174c89aea78b3b.png" alt="1" width="0" height="0"><br> 通过mutation更新<br> <a href="http://img.e-com-net.com/image/info8/4aff2b03ffa645fab4e5f9de2cadd844.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/4aff2b03ffa645fab4e5f9de2cadd844.png" alt="2" width="425" height="98"></a></p> <h4>Mutation传递参数</h4> <p>在通过mutation更新数据的时候, 有可能我们希望携带一些额外的参数<br> 参数被称为是mutation的载荷(Payload)</p> <p>Mutation中的代码:<br> <img src="http://img.e-com-net.com/image/info8/c364520583844a89b5f3b536aed0d060.png" alt="1" width="0" height="0"><br> <a href="http://img.e-com-net.com/image/info8/5646e89ac80049d4a598c3ddd3755dcf.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/5646e89ac80049d4a598c3ddd3755dcf.png" alt="2" width="461" height="98"></a></p> <h4>Mutation响应规则</h4> <p>Vuex的store中的state是响应式的, 当state中的数据发生改变时, Vue组件会自动更新.</p> <p>这就要求我们必须遵守一些Vuex对应的规则:<br> 提前在store中初始化好所需的属性.<br> 当给state中的对象添加新属性时, 使用下面的方式:<br> 方式一: 使用Vue.set(obj, ‘newProp’, 123)<br> 方式二: 用心对象给旧对象重新赋值</p> <p>我们来看一个例子:<br> 当我们点击更新信息时, 界面并没有发生对应改变.<br> <a href="http://img.e-com-net.com/image/info8/49cac5a7d9a94fc1805a2b192af7661d.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/49cac5a7d9a94fc1805a2b192af7661d.jpg" alt="VUE学习随笔_第41张图片" width="650" height="312" style="border:1px solid black;"></a><br> 如何才能让它改变呢?<br> 查看下面代码的方式一和方式二<br> 都可以让state中的属性是响应式的.<br> <a href="http://img.e-com-net.com/image/info8/fa346a90113c4bc597a1ec9fef8c5696.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/fa346a90113c4bc597a1ec9fef8c5696.jpg" alt="VUE学习随笔_第42张图片" width="650" height="218" style="border:1px solid black;"></a><br> <strong>Mutation同步函数</strong></p> <p>通常情况下, Vuex要求我们Mutation中的方法必须是同步方法.<br> 主要的原因是当我们使用devtools时, 可以devtools可以帮助我们捕捉mutation的快照.<br> 但是如果是异步操作, 那么devtools将不能很好的追踪这个操作什么时候会被完成.</p> <h2>Action的基本定义</h2> <p>我们强调, 不要再Mutation中进行异步操作.</p> <p>但是某些情况, 我们确实希望在Vuex中进行一些异步操作, 比如网络请求, 必然是异步的. 这个时候怎么处理呢?<br> Action类似于Mutation, 但是是用来代替Mutation进行异步操作的.</p> <p>Action的基本使用代码如下:<br> <a href="http://img.e-com-net.com/image/info8/10c4eca4679442149fe6ea9fb3dcb688.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/10c4eca4679442149fe6ea9fb3dcb688.jpg" alt="VUE学习随笔_第43张图片" width="600" height="476" style="border:1px solid black;"></a><br> context是什么?<br> context是和store对象具有相同方法和属性的对象.<br> 也就是说, 我们可以通过context去进行commit相关的操作, 也可以获取context.state等.</p> <h1>8、箭头函数</h1> <p>箭头函数: 也是一种定义函数的方式</p> <p>1.定义函数的方式: function</p> <pre><code class="prism language-javascript"> <span class="token keyword">const</span> <span class="token function-variable function">aaa</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 punctuation">}</span> </code></pre> <p>2.对象字面量中定义函数</p> <pre><code class="prism language-javascript"> <span class="token keyword">const</span> obj <span class="token operator">=</span> <span class="token punctuation">{ </span> <span class="token function">bbb</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{ </span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>3.ES6中的箭头函数</p> <pre><code class="prism language-javascript"> <span class="token keyword">const</span> <span class="token function-variable function">ccc</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{ </span> <span class="token punctuation">}</span> </code></pre> <h2>箭头函数参数和返回值</h2> <p><strong>参数问题:</strong><br> 1.1.放入两个参数.</p> <pre><code class="prism language-javascript"> <span class="token keyword">const</span> <span class="token function-variable function">sum</span> <span class="token operator">=</span> <span class="token punctuation">(</span>num1<span class="token punctuation">,</span> num2<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{ </span> <span class="token keyword">return</span> num1 <span class="token operator">+</span> num2 <span class="token punctuation">}</span> </code></pre> <p>1.2.放入一个参数</p> <pre><code class="prism language-javascript"> <span class="token keyword">const</span> <span class="token function-variable function">power</span> <span class="token operator">=</span> num <span class="token operator">=></span> <span class="token punctuation">{ </span> <span class="token keyword">return</span> num <span class="token operator">*</span> num <span class="token punctuation">}</span> </code></pre> <p>2.1.函数代码块中有多行代码时</p> <pre><code class="prism language-javascript"> <span class="token keyword">const</span> <span class="token function-variable function">test</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{ </span> <span class="token comment">// 1.打印Hello World</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Hello World'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 2.打印Hello Vuejs</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Hello Vuejs'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>2.2.函数代码块中只有一行代码</p> <pre><code class="prism language-javascript"> <span class="token keyword">const</span> <span class="token function-variable function">mul</span> <span class="token operator">=</span> <span class="token punctuation">(</span>num1<span class="token punctuation">,</span> num2<span class="token punctuation">)</span> <span class="token operator">=></span> num1 <span class="token operator">*</span> num2 console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token function">mul</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <h2>箭头函数中的this的使用</h2> <p>箭头函数中的this是如何查找的了?<br> 向外层作用域中, 一层层查找this, 直到有this的定义</p> <pre><code class="prism language-javascript"> <span class="token keyword">const</span> obj <span class="token operator">=</span> <span class="token punctuation">{ </span> <span class="token function">aaa</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{ </span> <span class="token function">setTimeout</span><span class="token punctuation">(</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 function">setTimeout</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{ </span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// window</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{ </span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// window</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{ </span> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{ </span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// window</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{ </span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// obj</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> obj<span class="token punctuation">.</span><span class="token function">aaa</span><span class="token punctuation">(</span><span class="token punctuation">)</span> </code></pre> <h1>9、Promise</h1> <p>Promise是异步编程的一种解决方案。</p> <p>那什么时候我们会来处理异步事件呢?</p> <ul> <li>一种很常见的场景应该就是网络请求了。</li> <li>我们封装一个网络请求的函数,因为不能立即拿到结果,所以不能像简单的3+4=7一样将结果返回。</li> <li>所以往往我们会传入另外一个函数,在数据请求成功时,将数据通过传入的函数回调出去。</li> <li>如果只是一个简单的网络请求,那么这种方案不会给我们带来很大的麻烦。但是,当网络请求非常复杂时,就会出现回调地狱。</li> </ul> <p><a href="http://img.e-com-net.com/image/info8/39de314b1cc34771a21ba7ffea4b9254.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/39de314b1cc34771a21ba7ffea4b9254.jpg" alt="VUE学习随笔_第44张图片" width="535" height="221" style="border:1px solid black;"></a><br> <strong>Promise最基本的语法。</strong></p> <p><a href="http://img.e-com-net.com/image/info8/f70f441e94ef41d4955fa43639810c89.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/f70f441e94ef41d4955fa43639810c89.jpg" alt="VUE学习随笔_第45张图片" width="507" height="167" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/315891b2a5474715a40e397d62413cf3.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/315891b2a5474715a40e397d62413cf3.jpg" alt="VUE学习随笔_第46张图片" width="650" height="394" style="border:1px solid black;"></a></p> <p>我们先来认认真真的读一读这个程序到底做了什么?</p> <p>new Promise很明显是创建一个Promise对象<br> 小括号中((resolve, reject) => {})也很明显就是一个函数,而且我们这里用的是之前刚刚学习过的箭头函数。<br> 但是resolve, reject它们是什么呢?<br> 我们先知道一个事实:在创建Promise时,传入的这个箭头函数是固定的(一般我们都会这样写)<br> resolve和reject它们两个也是函数,通常情况下,我们会根据请求数据的成功和失败来决定调用哪一个。<br> 成功还是失败?<br> 如果是成功的,那么通常我们会调用resolve(messsage),这个时候,我们后续的then会被回调。<br> 如果是失败的,那么通常我们会调用reject(error),这个时候,我们后续的catch会被回调。<br> OK,这就是Promise最基本的使用了。</p> <h3>Promise三种状态</h3> <p>首先, 当我们开发中有异步操作时, 就可以给异步操作包装一个Promise<br> 异步操作之后会有三种状态</p> <p>pending:等待状态,比如正在进行网络请求,或者定时器没有到时间。<br> fulfill:满足状态,当我们主动回调了resolve时,就处于该状态,并且会回调.then()<br> reject:拒绝状态,当我们主动回调了reject时,就处于该状态,并且会回调.catch()</p> <h3>Promise链式调用</h3> <p><a href="http://img.e-com-net.com/image/info8/42e0e49a74d8418bb26c5f5826735a6e.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/42e0e49a74d8418bb26c5f5826735a6e.jpg" alt="VUE学习随笔_第47张图片" width="650" height="626" style="border:1px solid black;"></a></p> <p>我们在看Promise的流程图时,发现无论是then还是catch都可以返回一个Promise对象。</p> <p>所以,我们的代码其实是可以进行链式调用的:</p> <p>这里我们直接通过Promise包装了一下新的数据,将Promise对象返回了</p> <p>Promise.resovle():将数据包装成Promise对象,并且在内部回调resolve()函数</p> <p>Promise.reject():将数据包装成Promise对象,并且在内部回调reject()函数</p> <h3>链式调用简写</h3> <p><a href="http://img.e-com-net.com/image/info8/9990e4ec16304607b28172136ca941aa.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/9990e4ec16304607b28172136ca941aa.jpg" alt="VUE学习随笔_第48张图片" width="650" height="652" style="border:1px solid black;"></a></p> <p>简化版代码:<br> 如果我们希望数据直接包装成Promise.resolve,那么在then中可以直接返回数据<br> 注意下面的代码中,我讲return Promise.resovle(data)改成了return data<br> 结果依然是一样的</p> <h1>10、网络模块封装</h1> <p>Vue中发送网络请求有非常多的方式, 那么, 在开发中, 如何选择呢?</p> <blockquote> <p>选择一: 传统的Ajax是基于XMLHttpRequest(XHR)<br> 为什么不用它呢?<br> 非常好解释, 配置和调用方式等非常混乱.<br> 编码起来看起来就非常蛋疼.<br> 所以真实开发中很少直接使用, 而是使用jQuery-Ajax</p> </blockquote> <blockquote> <p>选择二: 在前面的学习中, 我们经常会使用jQuery-Ajax<br> 相对于传统的Ajax非常好用.<br> 为什么不选择它呢?<br> 首先, 我们先明确一点: 在Vue的整个开发中都是不需要使用jQuery了.<br> 那么, 就意味着为了方便我们进行一个网络请求, 特意引用一个jQuery, 你觉得合理吗?<br> jQuery的代码1w+行.<br> Vue的代码才1w+行.<br> 完全没有必要为了用网络请求就引用这个重量级的框架.</p> </blockquote> <blockquote> <p>选择三: 官方在Vue1.x的时候, 推出了Vue-resource.<br> Vue-resource的体积相对于jQuery小很多.<br> 另外Vue-resource是官方推出的.<br> 为什么不选择它呢?<br> 在Vue2.0退出后, Vue作者就在GitHub的Issues中说明了去掉vue-resource, 并且以后也不会再更新.<br> 那么意味着以后vue-reource不再支持新的版本时, 也不会再继续更新和维护.<br> 对以后的项目开发和维护都存在很大的隐患.</p> </blockquote> <blockquote> <p>选择四: 在说明不再继续更新和维护vue-resource的同时, 作者还推荐了一个框架: axios为什么不用它呢?<br> axios有非常多的优点, 并且用起来也非常方便.</p> </blockquote> <h2>jsonp</h2> <p>在前端开发中, 我们一种常见的网络请求方式就是JSONP<br> 使用JSONP最主要的原因往往是为了解决跨域访问的问题.</p> <h3>JSONP的原理</h3> <p>JSONP的核心在于通过<code><script></code>标签的src来帮助我们请求数据.<br> 原因是我们的项目部署在domain1.com服务器上时, 是不能直接访问domain2.com服务器上的资料的.<br> 这个时候, 我们利用<code><script></code>标签的src帮助我们去服务器请求到数据, 将数据当做一个javascript的函数来执行, 并且执行的过程中传入我们需要的json.<br> 所以, 封装jsonp的核心就在于我们监听window上的jsonp进行回调时的名称.</p> <h4>JSONP封装</h4> <p><a href="http://img.e-com-net.com/image/info8/faa379d8fcdf4b29af6130c3420de02f.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/faa379d8fcdf4b29af6130c3420de02f.jpg" alt="VUE学习随笔_第49张图片" width="650" height="562" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/25093a9699ea4d3485e9246a3ec62cc6.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/25093a9699ea4d3485e9246a3ec62cc6.jpg" alt="VUE学习随笔_第50张图片" width="650" height="195" style="border:1px solid black;"></a></p> <h2>axios</h2> <p>功能特点:</p> <ol> <li>在浏览器中发送 XMLHttpRequests 请求</li> <li>在 node.js 中发送 http请求</li> <li>支持 Promise API</li> <li>拦截请求和响应</li> <li>转换请求和响应数据</li> </ol> <h3>axiox请求方式</h3> <p>支持多种请求方式:</p> <ul> <li>axios(config)</li> <li>axios.request(config)</li> <li>axios.get(url[, config])</li> <li>axios.delete(url[, config])</li> <li>axios.head(url[, config])</li> <li>axios.post(url[, data[, config]])</li> <li>axios.put(url[, data[, config]])</li> <li>axios.patch(url[, data[, config]])</li> </ul> <h4>发送get请求演示</h4> <p><a href="http://img.e-com-net.com/image/info8/2c5b3a77b8e140d49afd9724a81c7b35.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/2c5b3a77b8e140d49afd9724a81c7b35.jpg" alt="VUE学习随笔_第51张图片" width="650" height="643" style="border:1px solid black;"></a></p> <h4>发送并发请求</h4> <p>有时候, 我们可能需求同时发送两个请求</p> <p>使用axios.all, 可以放入多个请求的数组.</p> <p>axios.all([]) 返回的结果是一个数组,使用 axios.spread 可将数组 [res1,res2] 展开为 res1, res2</p> <p><a href="http://img.e-com-net.com/image/info8/4ffea4d8e0de4d3d90b47047f465eda0.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/4ffea4d8e0de4d3d90b47047f465eda0.jpg" alt="VUE学习随笔_第52张图片" width="650" height="308" style="border:1px solid black;"></a></p> <h4>全局配置</h4> <p>在上面的示例中, 我们的BaseURL是固定的<br> 事实上, 在开发中可能很多参数都是固定的.<br> 这个时候我们可以进行一些抽取, 也可以利用axiox的全局配置<br> <a href="http://img.e-com-net.com/image/info8/294ea667d17743418374f072f6b6e5fe.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/294ea667d17743418374f072f6b6e5fe.jpg" alt="VUE学习随笔_第53张图片" width="650" height="306" style="border:1px solid black;"></a></p> <h4>常见的配置选项</h4> <blockquote> <p>请求地址<br> url: ‘/user’,<br> 请求类型<br> method: ‘get’,<br> 请根路径<br> baseURL: ‘http://www.mt.com/api’,<br> 请求前的数据处理<br> transformRequest:[function(data){}],<br> 请求后的数据处理<br> transformResponse: [function(data){}],<br> 自定义的请求头<br> headers:{‘x-Requested-With’:‘XMLHttpRequest’},<br> URL查询对象<br> params:{ id: 12 },</p> <p>查询对象序列化函数<br> paramsSerializer: function(params){ }<br> request body<br> data: { key: ‘aa’},<br> 超时设置s<br> timeout: 1000,<br> 跨域是否带Token<br> withCredentials: false,<br> 自定义请求处理<br> adapter: function(resolve, reject, config){},<br> 身份验证信息<br> auth: { uname: ‘’, pwd: ‘12’},<br> 响应的数据格式 json / blob /document /arraybuffer / text / stream<br> responseType: ‘json’,</p> </blockquote> <h4>axios的实例</h4> <ul> <li> <p>为什么要创建axios的实例呢?</p> </li> <li> <p>当我们从axios模块中导入对象时, 使用的实例是默认的实例.</p> </li> <li> <p>当给该实例设置一些默认配置时, 这些配置就被固定下来了.</p> </li> <li> <p>但是后续开发中, 某些配置可能会不太一样.</p> </li> <li> <p>比如某些请求需要使用特定的baseURL或者timeout或者content-Type等.</p> </li> <li> <p>这个时候, 我们就可以创建新的实例, 并且传入属于该实例的配置信息</p> </li> </ul> <p><a href="http://img.e-com-net.com/image/info8/d80746d4f4724923ae475b5090d95344.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/d80746d4f4724923ae475b5090d95344.jpg" alt="VUE学习随笔_第54张图片" width="650" height="206" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/c74ee22f9ff64f5ca66bf57a81322899.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/c74ee22f9ff64f5ca66bf57a81322899.jpg" alt="VUE学习随笔_第55张图片" width="551" height="283" style="border:1px solid black;"></a></p> <h4>axios封装</h4> <p><a href="http://img.e-com-net.com/image/info8/616bec8cb96f42e1bbe27bed0e4be03c.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/616bec8cb96f42e1bbe27bed0e4be03c.jpg" alt="VUE学习随笔_第56张图片" width="650" height="556" style="border:1px solid black;"></a></p> <h4>拦截器</h4> <p>axios提供了拦截器,用于我们在发送每次请求或者得到相应后,进行对应的处理<br> <a href="http://img.e-com-net.com/image/info8/de631d29097d4386897cbd2587d97a80.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/de631d29097d4386897cbd2587d97a80.jpg" alt="VUE学习随笔_第57张图片" width="650" height="437" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/c61ccd8be46d42469e08e63e4dd73d8a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/c61ccd8be46d42469e08e63e4dd73d8a.jpg" alt="VUE学习随笔_第58张图片" width="544" height="403" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/3b3da4c9a61b446a9346bab923528202.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/3b3da4c9a61b446a9346bab923528202.jpg" alt="3" width="650" height="76"></a><br> 拦截器中都做什么呢?</p> <p><a href="http://img.e-com-net.com/image/info8/5db0bdcc6c74477a98e4759f03f7fcff.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/5db0bdcc6c74477a98e4759f03f7fcff.jpg" alt="VUE学习随笔_第59张图片" width="650" height="226" style="border:1px solid black;"></a><br> 请求拦截中错误拦截较少,通常都是配置相关的拦截<br> 可能的错误比如请求超时,可以将页面跳转到一个错误页面中。</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1352083586651598848"></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,vue,javascript,js,vue.js,css)</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/1835506236842405888.htm" title="C#中使用split分割字符串" target="_blank">C#中使用split分割字符串</a> <span class="text-muted">互联网打工人no1</span> <a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a> <div>1、用字符串分隔:usingSystem.Text.RegularExpressions;stringstr="aaajsbbbjsccc";string[]sArray=Regex.Split(str,"js",RegexOptions.IgnoreCase);foreach(stringiinsArray)Response.Write(i.ToString()+"");输出结果:aaabbbc</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/1835498547785592832.htm" title="【华为OD机试真题2023B卷 JAVA&JS】We Are A Team" target="_blank">【华为OD机试真题2023B卷 JAVA&JS】We Are A Team</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/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BA/1.htm">华为</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>华为OD2023(B卷)机试题库全覆盖,刷题指南点这里WeAreATeam时间限制:1秒|内存限制:32768K|语言限制:不限题目描述:总共有n个人在机房,每个人有一个标号(1<=标号<=n),他们分成了多个团队,需要你根据收到的m条消息判定指定的两个人是否在一个团队中,具体的:1、消息构成为:abc,整数a、b分别代</div> </li> <li><a href="/article/1835497074049773568.htm" title="数组去重" target="_blank">数组去重</a> <span class="text-muted">好奇的猫猫猫</span> <div>整理自js中基础数据结构数组去重问题思考?如何去除数组中重复的项例如数组:[1,3,4,3,5]我们在做去重的时候,一开始想到的肯定是,逐个比较,外面一层循环,内层后一个与前一个一比较,如果是久不将当前这一项放进新的数组,挨个比较完之后返回一个新的去过重复的数组不好的实践方式上述方法效率极低,代码量还多,思考?有没有更好的方法这时候不禁一想当然有了!!!hashtable啊,通过对象的hash办法</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/1835494258262503424.htm" title="【JS】执行时长(100分) |思路参考+代码解析(C++)" target="_blank">【JS】执行时长(100分) |思路参考+代码解析(C++)</a> <span class="text-muted">l939035548</span> <a class="tag" taget="_blank" href="/search/JS/1.htm">JS</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a> <div>题目为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。假设GPU最多一次执行n个任务,一次执行耗时1秒,在保证GPU不空闲情况下,最少需要多长时间执行完成。题目输入第一个参数为GPU一次最多执行的任务个数,取值范围[1,10000]第二个参数为任务数组长度,取值范围[1,10000]第三个参数为任务数组,数字范围</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/1835485429059645440.htm" title="docker" target="_blank">docker</a> <span class="text-muted">igotyback</span> <a class="tag" taget="_blank" href="/search/eureka/1.htm">eureka</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a> <div>Docker容器的文件系统是隔离的,但是可以通过挂载卷(Volumes)或绑定挂载(BindMounts)将宿主机的文件系统目录映射到容器内部。要查看Docker容器的映射路径,可以使用以下方法:查看容器配置:使用dockerinspect命令可以查看容器的详细配置信息,包括挂载的卷。例如:bashdockerinspect在输出的JSON格式中,查找"Mounts"部分,这里会列出所有的挂载信息</div> </li> <li><a href="/article/1835480639814594560.htm" title="在Ubuntu中编译含有JSON的文件出现报错" target="_blank">在Ubuntu中编译含有JSON的文件出现报错</a> <span class="text-muted">芝麻糊76</span> <a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/kill_bug/1.htm">kill_bug</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a> <div>在ubuntu中进行JSON相关学习的时候,我发现了一些小问题,决定与大家进行分享,减少踩坑时候出现不必要的时间耗费截取部分含有JSON部分的代码进行展示char*str="{\"title\":\"JSONExample\",\"author\":{\"name\":\"JohnDoe\",\"age\":35,\"isVerified\":true},\"tags\":[\"json\",\"</div> </li> <li><a href="/article/1835478496810463232.htm" title="Xinference如何注册自定义模型" target="_blank">Xinference如何注册自定义模型</a> <span class="text-muted">玩人工智能的辣条哥</span> <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/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/Xinference/1.htm">Xinference</a> <div>环境:Xinference问题描述:Xinference如何注册自定义模型解决方案:1.写个model_config.json,内容如下{"version":1,"context_length":2048,"model_name":"custom-llama-3","model_lang":["en","ch"],"model_ability":["generate","chat"],"model</div> </li> <li><a href="/article/1835455048277127168.htm" title="Python神器!WEB自动化测试集成工具 DrissionPage" target="_blank">Python神器!WEB自动化测试集成工具 DrissionPage</a> <span class="text-muted">亚丁号</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>一、前言用requests做数据采集面对要登录的网站时,要分析数据包、JS源码,构造复杂的请求,往往还要应付验证码、JS混淆、签名参数等反爬手段,门槛较高。若数据是由JS计算生成的,还须重现计算过程,体验不好,开发效率不高。使用浏览器,可以很大程度上绕过这些坑,但浏览器运行效率不高。因此,这个库设计初衷,是将它们合而为一,能够在不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率</div> </li> <li><a href="/article/1835453535777550336.htm" title="vue3中el-table中点击图片放大时,被表格覆盖" target="_blank">vue3中el-table中点击图片放大时,被表格覆盖</a> <span class="text-muted">叫我小鹏呀</span> <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>问题:vue3中el-table中点击图片放大时,被表格覆盖。解决方法:el-image添加preview-teleported</div> </li> <li><a href="/article/1835452528599330816.htm" title="vue项目element-ui的table表格单元格合并" target="_blank">vue项目element-ui的table表格单元格合并</a> <span class="text-muted">酋长哈哈</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/elementui/1.htm">elementui</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>一、合并效果二全部代码exportdefault{name:'CellMerge',data(){return{tableData:[{id:'1',name:'王小虎',amount1:'165',amount2:'3.2',amount3:10},{id:'1',name:'王小虎',amount1:'162',amount2:'4.43',amount3:12},{id:'1',name:'</div> </li> <li><a href="/article/1835450384655675392.htm" title="Vue中table合并单元格用法" target="_blank">Vue中table合并单元格用法</a> <span class="text-muted">weixin_30613343</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/ViewUI/1.htm">ViewUI</a> <div>地名结果人名性别{{item.name}}已完成未完成{{item.groups[0].name}}{{item.groups[0].sex}}{{item.groups[son].name}}{{item.groups[son].sex}}exportdefault{data(){return{list:[{name:'地名1',result:'1',groups:[{name:'张三',sex</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/1835447985601867776.htm" title="Mongodb Error: queryTxt ETIMEOUT xxxx.wwwdz.mongodb.net" target="_blank">Mongodb Error: queryTxt ETIMEOUT xxxx.wwwdz.mongodb.net</a> <span class="text-muted">佛一脚</span> <a class="tag" taget="_blank" href="/search/error/1.htm">error</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>背景每天都能遇到奇怪的问题,做个记录,以便有缘人能得到帮助!换了一台电脑开发nextjs程序。需要连接mongodb数据,对数据进行增删改查。上一台电脑好好的程序,新电脑死活连不上mongodb数据库。同一套代码,没任何修改,搞得我怀疑人生了,打开浏览器进入mongodb官网毫无问题,也能进入线上系统查看数据,网络应该是没问题。于是我尝试了一下手机热点,这次代码能正常跑起来,连接数据库了!!!是不</div> </li> <li><a href="/article/1835443569528238080.htm" title="Vue( ElementUI入门、vue-cli安装)" target="_blank">Vue( ElementUI入门、vue-cli安装)</a> <span class="text-muted">m0_l5z</span> <a class="tag" taget="_blank" href="/search/elementui/1.htm">elementui</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a> <div>一.ElementUI入门目录:1.ElementUI入门1.1ElementUI简介1.2Vue+ElementUI安装1.3开发示例2.搭建nodejs环境2.1nodejs介绍2.2npm是什么2.3nodejs环境搭建2.3.1下载2.3.2解压2.3.3配置环境变量2.3.4配置npm全局模块路径和cache默认安装位置2.3.5修改npm镜像提高下载速度2.3.6验证安装结果3.运行n</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/1835435885760442368.htm" title="vue+el-table 可输入表格使用上下键进行input框切换" target="_blank">vue+el-table 可输入表格使用上下键进行input框切换</a> <span class="text-muted">以对_</span> <a class="tag" taget="_blank" href="/search/vue%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/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>使用上下键进行完工数量这一列的切换-->//键盘触发事件show(ev,index){letnewIndex;letinputAll=document.querySelectorAll('.table_inputinput');//向上=38if(ev.keyCode==38){if(index==0){//如果是第一行,回到最后一个newIndex=inputAll.length-1}elsei</div> </li> <li><a href="/article/1835435885122908160.htm" title="vue + Element UI table动态合并单元格" target="_blank">vue + Element UI table动态合并单元格</a> <span class="text-muted">我家媳妇儿萌哒哒</span> <a class="tag" taget="_blank" href="/search/element/1.htm">element</a><a class="tag" taget="_blank" href="/search/UI/1.htm">UI</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><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>一、功能需求1、根据名称相同的合并工作阶段和主要任务合并这两列,但主要任务内容一样,但要考虑主要任务一样,但工作阶段不一样的情况。(枞向合并)2、落实情况里的定量内容和定性内容值一样则合并。(横向合并)二、功能实现exportdefault{data(){return{tableData:[{name:'a',address:'1',age:'1',six:'2'},{name:'a',addre</div> </li> <li><a href="/article/1835435506645692416.htm" title="00. 这里整理了最全的爬虫框架(Java + Python)" target="_blank">00. 这里整理了最全的爬虫框架(Java + Python)</a> <span class="text-muted">有一只柴犬</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E7%B3%BB%E5%88%97/1.htm">爬虫系列</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>目录1、前言2、什么是网络爬虫3、常见的爬虫框架3.1、java框架3.1.1、WebMagic3.1.2、Jsoup3.1.3、HttpClient3.1.4、Crawler4j3.1.5、HtmlUnit3.1.6、Selenium3.2、Python框架3.2.1、Scrapy3.2.2、BeautifulSoup+Requests3.2.3、Selenium3.2.4、PyQuery3.2</div> </li> <li><a href="/article/1835431726982197248.htm" title="vue 创建项目报错:command failed: npm install --loglevel error" target="_blank">vue 创建项目报错:command failed: npm install --loglevel error</a> <span class="text-muted">那鱼、会飞</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/vue-cli3/1.htm">vue-cli3</a> <div>这个问题其实很好解决,只是很多种情况,逐一排除即可。稳下心来~vuecli3创建项目我的node版本是node14.15.0,(永远不要尝试最新版本)node各种版本下载地址:以往的版本|Node.js(nodejs.org)vue/cli@3.12.1npminstall-g@vue/cli@3.12.1(注意vue/cli2和vue/cli3的下载命名有所改变,2是-形式,3是/形式)其实报错</div> </li> <li><a href="/article/1835430719363575808.htm" title="更改npm镜像源为淘宝镜像" target="_blank">更改npm镜像源为淘宝镜像</a> <span class="text-muted">骆小骆</span> <a class="tag" taget="_blank" href="/search/%E5%9F%BA%E4%BA%8Enode.js/1.htm">基于node.js</a> <div>npm常用指令后缀*最近复习了一下node.js整理了一下跟node.js相关的指令后缀*--save、-S参数意思是把模块的版本信息保存到dependencies(生产环境依赖)中,即你的package.json文件的dependencies字段中;–--save-dev、-D参数意思是把模块版本信息保存到devDependencies(开发环境依赖)中,即你的package.json文件的de</div> </li> <li><a href="/article/1835430340806668288.htm" title="COCO 格式的数据集转化为 YOLO 格式的数据集" target="_blank">COCO 格式的数据集转化为 YOLO 格式的数据集</a> <span class="text-muted">QYQY77</span> <a class="tag" taget="_blank" href="/search/YOLO/1.htm">YOLO</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>"""--json_path输入的json文件路径--save_path保存的文件夹名字,默认为当前目录下的labels。"""importosimportjsonfromtqdmimporttqdmimportargparseparser=argparse.ArgumentParser()parser.add_argument('--json_path',default='./instances</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/29.htm" title="SQL的各种连接查询" target="_blank">SQL的各种连接查询</a> <span class="text-muted">xieke90</span> <a class="tag" taget="_blank" href="/search/UNION+ALL/1.htm">UNION ALL</a><a class="tag" taget="_blank" href="/search/UNION/1.htm">UNION</a><a class="tag" taget="_blank" href="/search/%E5%A4%96%E8%BF%9E%E6%8E%A5/1.htm">外连接</a><a class="tag" taget="_blank" href="/search/%E5%86%85%E8%BF%9E%E6%8E%A5/1.htm">内连接</a><a class="tag" taget="_blank" href="/search/JOIN/1.htm">JOIN</a> <div>一、内连接   概念:内连接就是使用比较运算符根据每个表共有的列的值匹配两个表中的行。                 内连接(join 或者inner join )       SQL语法:       select * fron</div> </li> <li><a href="/article/156.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/%E7%BB%A7%E6%89%BF/1.htm">继承</a><a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%90%86/1.htm">代理</a><a class="tag" taget="_blank" href="/search/%E7%BB%84%E5%90%88/1.htm">组合</a><a class="tag" taget="_blank" href="/search/final%E7%B1%BB/1.htm">final类</a> <div>      复用类看着标题都不知道是什么,再加上java编程思想翻译的比价难懂,所以知道现在才看这本软件界的奇书   一:组合语法:就是将对象的引用放到新类中即可     代码:     package com.wj.reuse; /** * * @author Administrator 组</div> </li> <li><a href="/article/283.htm" title="[开源与生态系统]国产CPU的生态系统" target="_blank">[开源与生态系统]国产CPU的生态系统</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/cpu/1.htm">cpu</a> <div>       计算机要从娃娃抓起...而孩子最喜欢玩游戏....       要让国产CPU在国内市场形成自己的生态系统和产业链,国家和企业就不能够忘记游戏这个非常关键的环节....       投入一些资金和资源,人力和政策,让游</div> </li> <li><a href="/article/410.htm" title="JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释" target="_blank">JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释</a> <span class="text-muted">商人shang</span> <a class="tag" taget="_blank" href="/search/jvm%E5%86%85%E5%AD%98/1.htm">jvm内存</a> <div>jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。 HotSpot虚拟机GC算法采用分代收</div> </li> <li><a href="/article/537.htm" title="页面上调用 QQ" target="_blank">页面上调用 QQ</a> <span class="text-muted">oloz</span> <a class="tag" taget="_blank" href="/search/qq/1.htm">qq</a> <div><A href="tencent://message/?uin=707321921&amp;Site=有事Q我&amp;Menu=yes">   <img style="border:0px;" src=http://wpa.qq.com/pa?p=1:707321921:1></a></div> </li> <li><a href="/article/664.htm" title="一些问题" target="_blank">一些问题</a> <span class="text-muted">文强chu</span> <a class="tag" taget="_blank" href="/search/%E9%97%AE%E9%A2%98/1.htm">问题</a> <div>1.eclipse 导出 doc  出现“The Javadoc command does not exist.” javadoc command 选择 jdk/bin/javadoc.exe 2.tomcate 配置 web 项目 ..... SQL:3.mysql  * 必须得放前面 否则  select&nbs</div> </li> <li><a href="/article/791.htm" title="生活没有安全感" target="_blank">生活没有安全感</a> <span class="text-muted">小桔子</span> <a class="tag" taget="_blank" href="/search/%E7%94%9F%E6%B4%BB/1.htm">生活</a><a class="tag" taget="_blank" href="/search/%E5%AD%A4%E7%8B%AC/1.htm">孤独</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8%E6%84%9F/1.htm">安全感</a> <div>       圈子好小,身边朋友没几个,交心的更是少之又少。在深圳,除了男朋友,没几个亲密的人。不知不觉男朋友成了唯一的依靠,毫不夸张的说,业余生活的全部。现在感情好,也很幸福的。但是说不准难免人心会变嘛,不发生什么大家都乐融融,发生什么很难处理。我想说如果不幸被分手(无论原因如何),生活难免变化很大,在深圳,我没交心的朋友。明</div> </li> <li><a href="/article/918.htm" title="php 基础语法" target="_blank">php 基础语法</a> <span class="text-muted">aichenglong</span> <a class="tag" taget="_blank" href="/search/php+%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95/1.htm">php 基本语法</a> <div>1 .1 php变量必须以$开头 <?php $a=” b”; echo ?> 1 .2 php基本数据库类型 Integer  float/double Boolean string 1 .3 复合数据类型 数组array和对象 object 1 .4 特殊数据类型  null 资源类型(resource)    $co</div> </li> <li><a href="/article/1045.htm" title="mybatis tools 配置详解" target="_blank">mybatis tools 配置详解</a> <span class="text-muted">AILIKES</span> <a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a> <div>MyBatis Generator中文文档 MyBatis Generator中文文档地址: http://generator.sturgeon.mopaas.com/ 该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中文版的文档的也会有一定的障碍,所以本章根据该中文文档以及实际应用,使用通俗的语言来讲解详细的配置。 本文使用Markdown进行编辑,但是博客显示效</div> </li> <li><a href="/article/1172.htm" title="继承与多态的探讨" target="_blank">继承与多态的探讨</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/JAVA%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1+%E7%BB%A7%E6%89%BF+%E5%AF%B9%E8%B1%A1/1.htm">JAVA面向对象 继承 对象</a> <div>继承 extends   多态 继承是面向对象最经常使用的特征之一:继承语法是通过继承发、基类的域和方法 //继承就是从现有的类中生成一个新的类,这个新类拥有现有类的所有extends是使用继承的关键字:     在A类中定义属性和方法; class A{ //定义属性 int age; //定义方法 public void go</div> </li> <li><a href="/article/1299.htm" title="JS的undefined与null的实例" target="_blank">JS的undefined与null的实例</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div><form name="theform" id="theform"> </form> <script language="javascript"> var a alert(typeof(b)); //这里提示undefined if(theform.datas</div> </li> <li><a href="/article/1426.htm" title="TDD实践(一)" target="_blank">TDD实践(一)</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/%E6%95%8F%E6%8D%B7/1.htm">敏捷</a><a class="tag" taget="_blank" href="/search/TDD/1.htm">TDD</a> <div>一.TDD概述         TDD:测试驱动开发,它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完全部功能的开发。     </div> </li> <li><a href="/article/1553.htm" title="[Maven学习笔记十]Maven Profile与资源文件过滤器" target="_blank">[Maven学习笔记十]Maven Profile与资源文件过滤器</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>什么是Maven Profile Maven Profile的含义是针对编译打包环境和编译打包目的配置定制,可以在不同的环境上选择相应的配置,例如DB信息,可以根据是为开发环境编译打包,还是为生产环境编译打包,动态的选择正确的DB配置信息   Profile的激活机制 1.Profile可以手工激活,比如在Intellij Idea的Maven Project视图中可以选择一个P</div> </li> <li><a href="/article/1680.htm" title="【Hive八】Hive用户自定义生成表函数(UDTF)" target="_blank">【Hive八】Hive用户自定义生成表函数(UDTF)</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a> <div>1. 什么是UDTF   UDTF,是User Defined Table-Generating Functions,一眼看上去,貌似是用户自定义生成表函数,这个生成表不应该理解为生成了一个HQL Table, 貌似更应该理解为生成了类似关系表的二维行数据集   2. 如何实现UDTF 继承org.apache.hadoop.hive.ql.udf.generic</div> </li> <li><a href="/article/1807.htm" title="tfs restful api 加auth 2.0认计" target="_blank">tfs restful api 加auth 2.0认计</a> <span class="text-muted">ronin47</span> <div>  目前思考如何给tfs的ngx-tfs api增加安全性。有如下两点:   一是基于客户端的ip设置。这个比较容易实现。   二是基于OAuth2.0认证,这个需要lua,实现起来相对于一来说,有些难度。   现在重点介绍第二种方法实现思路。    前言:我们使用Nginx的Lua中间件建立了OAuth2认证和授权层。如果你也有此打算,阅读下面的文档,实现自动化并获得收益。SeatGe</div> </li> <li><a href="/article/1934.htm" title="jdk环境变量配置" target="_blank">jdk环境变量配置</a> <span class="text-muted">byalias</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a> <div>进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置: 1、下载jdk(http://java.sun.com/javase/downloads/index.jsp),我下载的版本是:jdk-7u79-windows-x64.exe 2、安装jdk-7u79-windows-x64.exe 3、配置环境变量:右击"计算机"-->&quo</div> </li> <li><a href="/article/2061.htm" title="《代码大全》表驱动法-Table Driven Approach-2" target="_blank">《代码大全》表驱动法-Table Driven Approach-2</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>package com.ljn.base; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.uti</div> </li> <li><a href="/article/2188.htm" title="SQL 数值四舍五入 小数点后保留2位" target="_blank">SQL 数值四舍五入 小数点后保留2位</a> <span class="text-muted">chicony</span> <a class="tag" taget="_blank" href="/search/%E5%9B%9B%E8%88%8D%E4%BA%94%E5%85%A5/1.htm">四舍五入</a> <div> 1.round() 函数是四舍五入用,第一个参数是我们要被操作的数据,第二个参数是设置我们四舍五入之后小数点后显示几位。 2.numeric 函数的2个参数,第一个表示数据长度,第二个参数表示小数点后位数。 例如:   select   cast(round(12.5,2)   as   numeric(5,2))  </div> </li> <li><a href="/article/2315.htm" title="c++运算符重载" target="_blank">c++运算符重载</a> <span class="text-muted">CrazyMizzz</span> <a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a> <div>一、加+,减-,乘*,除/ 的运算符重载 Rational operator*(const Rational &x) const{ return Rational(x.a * this->a); } 在这里只写乘法的,加减除的写法类似 二、<<输出,>>输入的运算符重载      &nb</div> </li> <li><a href="/article/2442.htm" title="hive DDL语法汇总" target="_blank">hive DDL语法汇总</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a><a class="tag" taget="_blank" href="/search/%E4%BF%AE%E6%94%B9%E5%88%97/1.htm">修改列</a><a class="tag" taget="_blank" href="/search/DDL/1.htm">DDL</a><a class="tag" taget="_blank" href="/search/%E4%BF%AE%E6%94%B9%E8%A1%A8/1.htm">修改表</a> <div>hive DDL语法汇总 1、对表重命名 hive> ALTER TABLE table_name RENAME TO new_table_name;   2、修改表备注 hive> ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comm</div> </li> <li><a href="/article/2569.htm" title="jbox使用说明" target="_blank">jbox使用说明</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a> <div>参考网址:http://www.kudystudio.com/jbox/jbox-demo.html jBox v2.3 beta [ 点击下载]  技术交流QQGroup:172543951 100521167 [2011-11-11] jBox v2.3 正式版 - [调整&修复] IE6下有iframe或页面有active、applet控件</div> </li> <li><a href="/article/2696.htm" title="UISegmentedControl 开发笔记" target="_blank">UISegmentedControl 开发笔记</a> <span class="text-muted">dcj3sjt126com</span> <div>  //    typedef NS_ENUM(NSInteger, UISegmentedControlStyle) {     //        UISegmentedControlStylePlain,     // large plain   &</div> </li> <li><a href="/article/2823.htm" title="Slick生成表映射文件" target="_blank">Slick生成表映射文件</a> <span class="text-muted">ekian</span> <a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>Scala添加SLICK进行数据库操作,需在sbt文件上添加slick-codegen包 "com.typesafe.slick" %% "slick-codegen" % slickVersion 因为我是连接SQL Server数据库,还需添加slick-extensions,jtds包 "com.typesa</div> </li> <li><a href="/article/2950.htm" title="ES-TEST" target="_blank">ES-TEST</a> <span class="text-muted">gengzg</span> <a class="tag" taget="_blank" href="/search/test/1.htm">test</a> <div>package com.MarkNum; import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.annotation</div> </li> <li><a href="/article/3077.htm" title="为何外键不再推荐使用" target="_blank">为何外键不再推荐使用</a> <span class="text-muted">hugh.wang</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/DB/1.htm">DB</a> <div>表的关联,是一种逻辑关系,并不需要进行物理上的“硬关联”,而且你所期望的关联,其实只是其数据上存在一定的联系而已,而这种联系实际上是在设计之初就定义好的固有逻辑。 在业务代码中实现的时候,只要按照设计之初的这种固有关联逻辑来处理数据即可,并不需要在数据库层面进行“硬关联”,因为在数据库层面通过使用外键的方式进行“硬关联”,会带来很多额外的资源消耗来进行一致性和完整性校验,即使很多时候我们并不</div> </li> <li><a href="/article/3204.htm" title="领域驱动设计" target="_blank">领域驱动设计</a> <span class="text-muted">julyflame</span> <a class="tag" taget="_blank" href="/search/VO/1.htm">VO</a><a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/DTO/1.htm">DTO</a><a class="tag" taget="_blank" href="/search/po/1.htm">po</a> <div>概念: VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。 DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对</div> </li> <li><a href="/article/3331.htm" title="单例设计模式" target="_blank">单例设计模式</a> <span class="text-muted">hm4123660</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Singleton/1.htm">Singleton</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">单例设计模式</a><a class="tag" taget="_blank" href="/search/%E6%87%92%E6%B1%89%E5%BC%8F/1.htm">懒汉式</a><a class="tag" taget="_blank" href="/search/%E9%A5%BF%E6%B1%89%E5%BC%8F/1.htm">饿汉式</a> <div>       单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。      &nb</div> </li> <li><a href="/article/3458.htm" title="logback" target="_blank">logback</a> <span class="text-muted">zhb8015</span> <a class="tag" taget="_blank" href="/search/log/1.htm">log</a><a class="tag" taget="_blank" href="/search/logback/1.htm">logback</a> <div>一、logback的介绍      Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-class</div> </li> <li><a href="/article/3585.htm" title="整合Kafka到Spark Streaming——代码示例和挑战" target="_blank">整合Kafka到Spark Streaming——代码示例和挑战</a> <span class="text-muted">Stark_Summer</span> <a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/storm/1.htm">storm</a><a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a><a class="tag" taget="_blank" href="/search/PARALLELISM/1.htm">PARALLELISM</a><a class="tag" taget="_blank" href="/search/processing/1.htm">processing</a> <div>作者Michael G. Noll是瑞士的一位工程师和研究员,效力于Verisign,是Verisign实验室的大规模数据分析基础设施(基础Hadoop)的技术主管。本文,Michael详细的演示了如何将Kafka整合到Spark Streaming中。 期间, Michael还提到了将Kafka整合到 Spark Streaming中的一些现状,非常值得阅读,虽然有一些信息在Spark 1.2版</div> </li> <li><a href="/article/3712.htm" title="spring-master-slave-commondao" target="_blank">spring-master-slave-commondao</a> <span class="text-muted">王新春</span> <a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/dataSource/1.htm">dataSource</a><a class="tag" taget="_blank" href="/search/slave/1.htm">slave</a><a class="tag" taget="_blank" href="/search/master/1.htm">master</a> <div>互联网的web项目,都有个特点:请求的并发量高,其中请求最耗时的db操作,又是系统优化的重中之重。 为此,往往搭建 db的 一主多从库的 数据库架构。作为web的DAO层,要保证针对主库进行写操作,对多个从库进行读操作。当然在一些请求中,为了避免主从复制的延迟导致的数据不一致性,部分的读操作也要到主库上。(这种需求一般通过业务垂直分开,比如下单业务的代码所部署的机器,读去应该也要从主库读取数</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>