View层
Model层
VueModel层
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-St4dNFG8-1611487584713)(36A4E1631C5B42C7A4767AF678DC320E)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ISB5XFUh-1611487584717)(AE5CB6C9476A440CB32319EF5D96001B)]
在挂载id的div里面写{ {内容来使用}}
执行一次性的插值,当数据改变的
ps:后面不需要跟任何表达式
解析并且渲染v-html后面跟的html
<a :href="link">Vuejs官网a>
用法一:可以直接通过{} 绑定一个类
<h2 :class="{
'active':isActive}">Hello Worldh2>
用法二:也可以通过判断,传入多个值
<h2 :class="{
'active':isActive , 'line': isLine}">Hello Worldh2>
用法三:和普通类同时存在 不冲突
用发丝如果太过复杂,可以放在一个Methods或者computed中
注:classes是一个计算属性
<h2 class="title" :class="classes">Hello Worldh2>
需要在外面套一个li标签,在li里面进行一个v-for遍历存在于data里面的数组
对象写法:
:style="{color:currentColor, fontSize :fontSize + 'px'}"
数组写法:
<div v-bind:style="[baseStyles,overridingStyles]">div>
模板可以通过插值语法显示一些data中的数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SQ6nTuYl-1611487584719)(0411889317D6467199EB517B8280F7D4)]
每个计算属性都包括一个setter和Getter
在某些情况下,可以提供一种setter方法
methods和computed看起来都可以实现我们的方法,为什么还要多个计算属性呢
原因:计算属性会进行缓存,如果多次使用,计算属性只会调用一次
computed是属性调用,methods是函数调用
computed带有缓存功能,methods并不是
computed是用属性方式调用不需要加()
methods是以方法的形式调用需要加()
对于复杂逻辑计算,可以用computed
computed依赖于data中的数据,只有在他的相关依赖数据发生改变的时候才会重新求值
作用:绑定事件监听器
缩写:@
预期:Function|Inline Statement | Object
参数: event
v-if是动态的向DOM树添加或者删除DOM元素;v-show是通过设置DOM元素的display样式来控制显隐
<li v-for="(value,key,index) in info">{
{value}}-{
{key}}-{
{index}}<li>
v-model其实是一个语法糖,他的背后其实是包含这两个操作
1.v-bind绑定一个value属性
2.v-on给当前元素绑定一个input事件
也就是如下
<input type="text" v-model="message">
等同于
lazy修饰符:
number修饰符:
trim修饰符:
查看运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JRii22vF-1611487584723)(D89A12BE329D4F8194E649F9496AF79C)]
注意:当子组件汉族测到父组件的Components,Vue回编译好父组件的模块
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z1Qu9X6Q-1611487584725)(38C4C7FA3AF84A07B1D104A03E6F1D49)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y5H9938h-1611487584727)(79639BF033F241B687B2462290899FA1)]
如果将所有的数据都放在Vue实例中,Vue实例就会变得很臃肿
结论:Vue组件应该有自己保存数据的地方
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M0nYdVcT-1611487584730)(484D20FBE6C24869AE5904C2B2CE2692)]
$dispatch:向上派发事件
$broadcast:向下级广播事件
父组件模板的所有东西都会在符集作用域内编译;子组件模板的所有东西都会在子级作用域内编译
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9NLGoFea-1611487584731)(7B03C79644EF46EC854BDA94628A09E5)]
属性:name
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h7QPG2m3-1611487584732)(28CF2025AAD745DF80A55CDA9F6CFB4E)]
作用域插槽:略
在多人同时分布开发的时候可能会发生重名的问题
(function(){
var flag = true
})()
但是如果我们希望能够在main.js中用到flag
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IelsohLo-1611487584733)(A1820B1171C04A77B0097B02C2E5C6BD)]
模块化有两个核心:导入和导出
//CommonJS的导入
module.exports ={
flag:true,
test(a,b){
return a + b;
},
demo(a,b){
return a * b
}
}
//CommonJS的导入
//require是指的是导入
let{
test , demo , flag} = require('moduleA');
<=>
let _mA = require('moduleA');
let test = _mA.test;
let demo = _mA.demo;
let flag = _mA.flag;
let name ="myname"
let age = 19
let height = 181
export {
name,age,height}
<script src="info.js" type="module"></script>
import {
name , age , height} from "./info.js"
但是通常情况下我们会把{name,age,height} 化作别名以便于后续的使用
import *as info from './info.js'
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Documenttitle>
<link rel="stylesheet" href="style.css">
head>
<body>
<div id="app">
<div v-if="books.length">
<table>
<thead>
<tr>
<th>th>
<th>作者th>
<th>书籍名称th>
<th>出版日期th>
<th>价格th>
<th>购买数量th>
<th>操作th>
tr>
thead>
<tbody>
<tr v-for="(item, index) in books">
<td>{
{item.id}}td>
<td>{
{item.author}}td>
<td>{
{item.name}}td>
<td>{
{item.data}}td>
<td>{
{item.price | showPrice}}td>
<td>
<button @click="decrement(index)" :disabled="item.count <= 1">-button>
{
{item.count}}
<button @click="increment(index)">+button>
td>
<td>
<button @click="removeHandler(index)">移除button>
td>
tr>
tbody>
table>
<h2>总价格:{
{totalPrice}}h2>
div>
<h2 v-else>
购物车为空
h2>
div>
<script src="../js/vue.js">script>
<script src="main.js">script>
body>
html>
style:
table{
border: 1 px solid #e9e9e9;
border-collapse: collapse;
border-spacing: 0;
}
th, td{
padding: 8px 16px;
border:1 px solid #e9e9e9;
text-align: left;
}
th{
background-color: #f7f7f7;
color: #5c6b77;
font-weight:600;
}
js
const app = new Vue({
el:"#app",
data:{
books:[
{
id: 1,
author: '曹雪芹',
name: '红楼梦',
data:"????-??-??",
price: 32.0,
count: 1
}, {
id: 2,
author: '施耐庵',
name: '水浒传',
data:"????-??-??",
price: 30.0,
count: 1
}, {
id: '3',
author: '罗贯中',
name: '三国演义',
data:"????-??-??",
price: 24.0,
count: 1
}, {
id: 4,
author: '吴承恩',
name: '西游记',
data:"????-??-??",
price: 20.0,
count: 1
}
]
},
methods:{
decrement(index){
this.books[index].count--;
},
increment(index){
this.books[index].count++;
},
removeHandler(index){
this.books.splice(index, 1);
},
},
computed:{
totalPrice(){
let totalPrice = 0;
for(let i = 0; i < this.books.length; i++){
totalPrice += this.books[i].price * this.books[i].count;
}
return totalPrice;
}
},
//全局过滤器 ,filter 不能定义在创建的Vue对象后面 ,filters局部过滤器
filters:{
showPrice(price){
return "¥" + price.toFixed(2);
}
},
})