Vue学习笔记

简介

Vue.js是一套构建用户界面的渐进式框架,Vue 只关注视图层, 采用自底向上增量开发的设计,Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件

创建vue项目

vue init webpack vue_demo

在这里插入图片描述
Project name(工程名):回车
Project description(工程介绍):回车
Author:作者名
Vue build(是否安装编译器):回车
Install vue-router(是否安装Vue路由):n
Use ESLint to lint your code(是否使用ESLint检查代码,我们使用idea即可):n
Set up unit tests(安装测试工具):n
Setup e2e tests with Nightwatch(测试相关):n
Should we run npm install for you after the project has been created? (recommended):选择:No, I will handle that myself

cd vue_demo         //进入项目
npm install         //初始化项目 

在这里插入图片描述

npm run dev             //运行项目

在这里插入图片描述
浏览器打开:http://localhost:8080,即可打开vue项目首页
在这里插入图片描述

目录结构

在这里插入图片描述

目录/文件说明
build项目构建(webpack)相关代码
config配置目录,包括端口号等
node_modulesnpm 加载的项目依赖模块
src这里是我们要开发的目录,90%操作都在这个目录。包括子的目录有:1、assets: 放置一些图片2、components: 放置组件代码文件3、App.vue项目入口文件 4、main.js 项目的核心文件
static静态资源目录,如图片、字体等
test初始测试目录,可删除
.xxxx文件这些是一些配置文件,包括语法配置,git配置等
index.html首页入口文件,你可以添加一些 meta 信息或统计代码啥的
package.json项目配置文件
README.md项目的说明文档,Markdown 格式

Vue实例

var vm = new Vue({
  // 选项
})

实例如下:

<div id="L_id">
    <h1>name : {{name}}</h1>
    <h1>age : {{age}}</h1>
    <h1>{{talk()}}</h1>
</div>
<script type="text/javascript">
    var vm = new Vue({
        el: '#L_id',
        data: {
            name: "L",
            age: 18
        },
        methods: {
            talk : function() {
                return  "Hi! boy ";
            }
        }
    })
    document.write(vm.name) //数据引用方式
    document.write(vm.talk())//方法调用方式
</script>

实例参数:

  • id :定义id(L_id)
  • data(属性):定义属性(name,age)
  • methods:定义方法(talk)
  • {{ }}:用于输出对象属性和函数返回值
  • . :调用方式
vue.js模板语法

Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据
Vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统
结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上

文本插值
<div id="app">
  <p>{{ message }}</p>
</div>
HTML插值

使用 v-html 指令用于输出 html 代码

<div id="app">
    <div v-html="message"></div> // v-html 指令用于输出html代码
</div>
<script>
new Vue({
  el: '#app',
  data: {
    message: '<h1>Hi!</h1>'
  }
})
</script>
属性插值

HTML 属性中的值应使用 v-bind 指令

<div id="app">
  <label for="r1">修改颜色</label><input type="checkbox" v-model="use" id="r1">
  <br><br>
  <div v-bind:class="{'class1': use}">
    v-bind:class 指令
  </div>
</div>
<script>
new Vue({
    el: '#app',
  data:{
      use: false
  }
});
</script>
表达式

Vue.js 都提供了完全的 JavaScript 表达式支持

<div id="app">
	{{5+5}}<br>
	{{ test ? 'YES' : 'NO' }}<br>
	{{ message.split('').reverse().join('') }}
</div>
<script>
new Vue({
  el: '#app',
  data: {
	test: true,
    message: 'TESTAPP',
  }
})
</script>
指令

指令是带有 v- 前缀的特殊属性
指令用于在表达式的值改变时,将某些行为应用到 DOM 上

<div id="app">
    <p v-if="seen">Can you see me?</p>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    seen: true
  }
})
</script>
参数

参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性
在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定

<div id="app">
    <pre><a v-bind:href="url">百度</a></pre>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    url: 'http://www.baidu.com'
  }
})
</script>
用户输入

在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定
v-model 指令用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值
按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应

<div id="app">
    <p>{{ message }}</p>
    <input v-model="message">
</div>
<script>
new Vue({
  el: '#app',
  data: {
    message: 'csdn'
  }
})
</script>
过滤器

Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下

<!-- 在两个大括号中 -->
{{ value | filterA }} 或 {{ value | filterA | filterB }}
<!-- 在 v-bind 指令中 -->
<div v-bind:id="value | filter"></div>
<div id="app">
  {{ message | capitalize }}
</div>
<script>
new Vue({
  el: '#app',
  data: {
    message: 'csdn.cn'
  },
  filters: {
    capitalize: function (value) {
      if (!value) return ''
      value = value.toString()
      return value.charAt(0).toUpperCase() + value.slice(1)
    }
  }
})
</script>
缩写

Vue.js为两个最常用的指令提供了特别的缩写

<!-- 完整语法 -->
<a v-bind:href="url"></a>
<!-- 缩写 -->
<a :href="url"></a>
<!-- 完整语法 -->
<a v-on:click="doSomething"></a>
<!-- 缩写 -->
<a @click="doSomething"></a>
Vue.js条件语句

条件判断使用 v-if 指令,v-else 指令可给给 v-if 添加一个 “else” 块

<div id="app">
    <div v-if="Math.random() > 0.6">
      good!
    </div>
    <div v-else>
      Bad!
    </div>
</div>
<script>
new Vue({
  el: '#app'
})
</script>
循环语句

循环使用 v-for 指令
v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组并且 site 是数组元素迭代的别名

<div id="app">
  <ol>
    <li v-for="site in sites">
      {{ site.name }}
    </li>
  </ol>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    sites: [
      { name: 'baudi' },
      { name: 'Google' },
      { name: 'Taobao' }
    ]
  }
})
</script>
Vue.js计算属性

计算属性关键词: computed, computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性

computed setter

computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter

var vm = new Vue({
  el: '#app',
  data: {
    name: 'Baidu',
    url: 'http://www.baidu.com'
  }
  computed: {
    site: {
      // getter
      get: function () {
        return this.name + ' ' + this.url
      },
      // setter
      set: function (newValue) {
        var names = newValue.split(' ')
        this.name = names[0]
        this.url = names[names.length - 1]
      }
    }
  }
})
vm.site = 'Google http://www.google.com';
Vue.js 监听属性

Vue.js 监听属性 watch,我们可以通过 watch 来响应数据的变化

<div id = "app">
    <p>计数器: {{ counter }}</p>
    <button @click = "counter++">Click it</button>
</div>
<script type = "text/javascript">
var vm = new Vue({
    el: '#app',
    data: {
        counter: 1
    }
});
vm.$watch('counter', function(new_value, old_value) {
    alert('计数器值的变化 :' + old_value + ' 变为 ' + new_value + '!');
});
</script>
Vue.js 样式绑定

class 与 style 是 HTML 元素的属性,用于设置元素的样式,我们可以用 v-bind 来设置样式属性
Vue.js v-bind 在处理 class 和 style 时, 专门增强了它。表达式的结果类型除了字符串之外,还可以是对象或数组

<style>
.active {
	background: green;
}
</style>
</head>
<body>
<div id="app">
  <div v-bind:class="{ active: isActive }"></div>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    isActive: true     // 实例中将 isActive 设置为 true 显示了一个绿色的 div 块,如果设置为 false 则不显示
  }
})
事件监听 v-on 指令

事件监听可以使用 v-on 指令

<div id="app">
  <button v-on:click="counter += 1">增加 1</button>
  <p>这个按钮被点击了 {{ counter }} 次。</p>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    counter: 0
  }
})
</script>
Vue.js 表单

可以用 v-model 指令在表单控件元素上创建双向数据绑定
输入框

<div id="app">
  <p> input 元素:</p>
  <input v-model="message">  // 修改输入内容,消息也会改变
  <p>消息是: {{ message }}</p>
  </div>
<script>
new Vue({
  el: '#app',
  data: {
    message: ‘csdn',
  }
})
</script>

单选框

<div id="app">
  <p>单选框:</p>
  <input type="checkbox" id="checkbox" v-model="checked">
  <label for="checkbox">{{ checked }}</label>  // 选中变成false,不选为相反:true
</div>
<script>
new Vue({
  el: '#app',
  data: {
    checked : false,
  }
})
</script>
Vue.js 组件

组件(Component)是 Vue.js 最强大的功能之一
组件可以扩展 HTML 元素,封装可重用的代码
组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树

注册一个全局组件语法格式如下

Vue.component(componentName, options)

tagName 为组件名,options 为配置选项。注册后,我们可以使用以下方式来调用组件:

<tagName></tagName>
全局组件
<div id="app">
    <componentName></componentName>
</div>
<script>
// 注册
Vue.component('componentName', {
  template: '<h1>自定义组件!</h1>'
})
// 创建根实例
new Vue({
  el: '#app'
})
</script>
局部组件

也可以在实例选项中注册局部组件,这样组件只能在这个实例中使用

<div id="app">
    <componentName></componentName>
</div>
<script>
var Child = {
  template: '<h1>自定义组件!</h1>'
}
// 创建根实例
new Vue({
  el: '#app',
  components: {
    // <runoob> 将只在父模板可用
    'componentName': Child
  }
})
</script>
Vue.js 自定义指令

除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点

<div id="app">
    <p>页面载入时,input 元素自动获取焦点:</p>
    <input v-focus>
</div>
<script>
// 注册一个全局自定义指令 v-focus
Vue.directive('focus', {
  // 当绑定元素插入到 DOM 中。
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})
// 创建根实例
new Vue({
  el: '#app'
})
</script>

也可以在实例使用 directives 选项来注册局部指令

<div id="app">
  <p>页面载入时,input 元素自动获取焦点:</p>
  <input v-focus>
</div>
<script>
// 创建根实例
new Vue({
  el: '#app',
  directives: {
    // 注册一个局部的自定义指令 v-focus
    focus: {
      // 指令的定义
      inserted: function (el) {
        // 聚焦元素
        el.focus()
      }
    }
  }
})
</script>
钩子函数

指令定义函数提供了几个钩子函数(可选):

  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
钩子函数参数

钩子函数的参数有:

  • el: 指令所绑定的元素,可以用来直接操作 DOM
  • binding: 一个对象,包含以下属性:
    • name: 指令名,不包括 v- 前缀
    • value: 指令的绑定值, 例如: v-my-directive=“1 + 1”, value 的值是 2
    • oldValue: 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用
    • expression: 绑定值的表达式或变量名。 例如 v-my-directive=“1 + 1” , expression 的值是 “1 + 1”
    • arg: 传给指令的参数。例如 v-my-directive:foo, arg 的值是 “foo”
    • modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }
  • vnode: Vue 编译生成的虚拟节点
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用
<div id="app"  v-baidu:hello.a.b="message">
</div>
<script>
Vue.directive('baidu', {
  bind: function (el, binding, vnode) {
    var s = JSON.stringify
    el.innerHTML =
      'name: '       + s(binding.name) + '<br>' +
      'value: '      + s(binding.value) + '<br>' +
      'expression: ' + s(binding.expression) + '<br>' +
      'argument: '   + s(binding.arg) + '<br>' +
      'modifiers: '  + s(binding.modifiers) + '<br>' +
      'vnode keys: ' + Object.keys(vnode).join(', ')
  }
})
new Vue({
  el: '#app',
  data: {
    message: 'ww.baidu.com‘
  }
})
</script>
Vue.js路由

Vue.js 路由允许我们通过不同的 URL 访问不同的内容。
通过 Vue.js 可以实现多视图的单页Web应用(single page web application,SPA)。
Vue.js 路由需要载入 vue-router 库
安装依赖

npm install vue-router

声明式导入

import Router from 'vue-router'

Vue.js + vue-router 可以很简单的实现单页应用
是一个组件,该组件用于设置一个导航链接,切换不同 HTML 内容。 to 属性为目标地址, 即要显示的内容
以下实例中我们将 vue-router 加进来,然后配置组件和路由映射

<div id="app">
  <h1>Hello App!</h1>
  <p>
    <!-- 使用 router-link 组件来导航. -->
    <!-- 通过传入 `to` 属性指定链接. -->
    <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
    <router-link to="/foo">Go to Foo</router-link>
    <router-link to="/bar">Go to Bar</router-link>
  </p>
  <!-- 路由出口 -->
  <!-- 路由匹配到的组件将渲染在这里 -->
  <router-view></router-view>
</div>
// 0. 如果使用模块化机制编程,导入 Vue 和 VueRouter,要调用 Vue.use(VueRouter)
// 1. 定义(路由)组件
// 可以从其他文件 import 进来
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }
// 2. 定义路由
// 每个路由应该映射一个组件。 其中"component" 可以是
// 通过 Vue.extend() 创建的组件构造器,
// 或者,只是一个组件配置对象
const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]
// 3. 创建 router 实例,然后传 `routes` 配置
const router = new VueRouter({
  routes // (缩写)相当于 routes: routes
})
// 4. 创建和挂载根实例。
// 记得要通过 router 配置参数注入路由
// 从而让整个应用都有路由功能
const app = new Vue({
  router
}).$mount('#app')
<router-link> 的属性
  • to:表示目标路由的链接。 当被点击后,内部会立刻把 to 的值传到 router.push(),所以这个值可以是一个字符串或者是描述目标位置的对象。
  • replace:设置 replace 属性的话,当点击时,会调用 router.replace() 而不是 router.push(),导航后不会留下 history 记录
  • append:设置 append 属性后,则在当前 (相对) 路径前添加基路径。
  • tag:有时候想要 渲染成某种标签,例如 <li>, 于是我们使用 tag prop 类指定何种标签,同样它还是会监听点击,触发导航
  • active-class:设置 链接激活时使用的 CSS 类名。可以通过以下代码来替代
  • exact-active-class:配置当链接被精确匹配的时候应该激活的 class。可以通过以下代码来替代
  • event:声明可以用来触发导航的事件。可以是一个字符串或是一个包含字符串的数组
Vue.js 过渡 & 动画
过渡

Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果
Vue 提供了内置的过渡封装组件,该组件用于包裹要实现过渡效果的组件
语法格式

<transition name = "nameoftransition">
   <div></div>
</transition>
<div id = "databinding">
<button v-on:click = "show = !show">Click me</button>
<transition name = "fade">
    <p v-show = "show" v-bind:style = "styleobj">动画实例</p>
</transition>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
    data: {
        show:true,
        styleobj :{
            fontSize:'30px',
            color:'red'
        }
    },
    methods : {
    }
});
</script>

过渡其实就是一个淡入淡出的效果。Vue在元素显示与隐藏的过渡中,提供了 6 个 class 来切换

  • v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
  • v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。
  • v-enter-to: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。
  • v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。
  • v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。
  • v-leave-to: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。
Vue.js混入

混入 (mixins)定义了一部分可复用的方法或者计算属性。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。注意! 一旦使用全局混入对象,将会影响到 所有 之后创建的 Vue 实例。使用恰当时,可以为自定义对象注入处理逻辑,使用不恰当时,会影响到每个单独创建的 Vue 实例 (包括第三方模板)。

局部混入
var vm = new Vue({
    el: '#databinding',
    data: {
    },
    methods : {
    },
});
// 定义一个混入对象
var myMixin = {
    created: function () {
        this.startmixin()
    },
    methods: {
        startmixin: function () {
            document.write("欢迎来到混入实例");
        }
    }
};
var Component = Vue.extend({
    mixins: [myMixin]
})
var component = new Component();
全局混入
// 为自定义的选项 'myOption' 注入一个处理器。
Vue.mixin({
  created: function () {
    var myOption = this.$options.myOption
    if (myOption) {
      console.log(myOption)
    }
  }
})
new Vue({
  myOption: 'hello!'
})
// => "hello!"
Vue.js Ajax(axios)

Vue.js 2.0 版本推荐使用 axios 来完成 ajax 请求
Axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中
安装方法

npm install axios

引用方法

<script src="https://unpkg.com/axios/dist/axios.min.js"></script> 

<script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script>

GET 方法

new Vue({
  el: '#app',
  data () {
    return {
      info: null
    }
  },
  mounted () {
    axios
      .get('https://www.runoob.com/try/ajax/json_demo.json')
      .then(response => (this.info = response))
      .catch(function (error) { // 请求失败处理
        console.log(error);
      });
  }
})

POST方法

new Vue({
  el: '#app',
  data () {
    return {
      info: null
    }
  },
  mounted () {
    axios
      .post('https://www.runoob.com/try/ajax/demo_axios_post.php')
      .then(response => (this.info = response))
      .catch(function (error) { // 请求失败处理
        console.log(error);
      });
  }
})

POST传递参数格式如下

axios.post('/user', {
    firstName: 'Fred',        // 参数 firstName
    lastName: 'Flintstone'    // 参数 lastName
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

axios API
可以通过向 axios 传递相关配置来创建请求

axios(config)
// 发送 POST 请求
axios({
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});
//  GET 请求远程图片
axios({
  method:'get',
  url:'http://bit.ly/2mTM3nY',
  responseType:'stream'
})
  .then(function(response) {
  response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
});
axios(url[, config])
// 发送 GET 请求(默认的方法)
axios('/user/12345');

也可用以下别名

axios.request(config)
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.patch(url[, data[, config]])
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小夏陌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值