vue 知识点

Vue

1 vue

angular框架

vue 谷歌集团

react.

vue是一个javascript的一个渐进式框架,使用比较多(二三线)
主要做视图 ,视图做好,然后数据改变视图会自动更新 ,无需操作dom,它自动会创建dom

2 vue核心 vue的指令

vue指令 
v-开头。  {{}}
​
1 v-text  == {{}} 渲染普通文本
2 v-html  渲染富文本  代表前端文本就是富文本
     容易造成注入攻击
3 v-for="" 遍历
    语法。v-for="(item,i) in list"    v-for="(item,i) of list"
    1 list 可为数组  可以数字  字符串  对象
    item 表示元素值  可以改名
    i 表示下标  可以改名
    
 4 v-on:  绑定事件 
 
 5 v-if  删除或者添加dom  true/显示  false/隐藏
  
 6 v-show  控制css的display属性 true/显示  false/隐藏
 
 7 v-else   v-else 必须和v-if是兄弟相邻元素 否则用不了 ,v-if反
​
 8 v-bind:title. ---> :title
     :属性 就是动态属性  “js语句”
     属性  静态属性。所有属性值都是字符串
     
 9 :class
  只有可能会改变的需要用动态class 否者可以使用静态的
  第一种写法
    :class='isTRue?"class1":"class2"' 三目运算
  第二种
   :class="{bg:i%2,class1:boolean,class2:boolean}"  属性:true/加 false不家
  第三种
   :class="[bg,bg1]"  数组形式
  
  10 :style
   <div class="box" :style="{background:'green',fontSize:'50px'}">111</div>
​
  11 v-model  双向数据绑定  v-model只能用于表单元素
    
     input type="text"
     input type='checkbox'
     input type="radio" 
     select option
     textArea
​
   
   效果 换肤
   1 背景颜色  
   2 字体大小
   3 行高
   

3 MVVM

双向数据绑定。--- 
M --  MODAL.  --- 数据模型   ---  data
V --  VIEw.   --- 视图模型。  ---  div#app
VM --  VIEW MODEL. -- 控制器。---  组件或者实例
​
数据改变。---  view自动更新
视图改变。--   数据自动更新

4 $set

在 vue2.0里面,数组的方法修改数组的时候实际上不能够监听改变,所以没有办法自动更新视图,所以在vue重写了一部分数组的方法,当方法改变的时候可以更新视图
所以。this.list[0] = 'aaa' 修改成功但是视图不更新
可以用 $set(修改的数组,索引,新值)  //可以更新视图的
​

5 v-if和v-show

关于 权限和安全的  必须用 v-if
如果其它的。考虑切换是否频繁 ,如果频繁建议v-show ,如果频繁的可以v-if
​
v-if 添加和删除dom
v-show 修改css属性。

6 v-model

  <div>
            <input type="text" v-model="username" placeholder="请输入用户名" />
        </div>
        <div>
            <input type="password" v-model="password" placeholder="请输入密码" />
        </div>
​
        <div>
            <label>
                <input type="radio" name="sex" v-model="sex" value="男"> 男
            </label>
            <label>
                <input type="radio" name="sex" v-model="sex" value="女"> 女
            </label>
        </div>
​
        <div>
            <select name="" id="" v-model="classes">
                <option value="">请选择</option>
                <option value="sy2201">sy2201</option>
                <option value="sy2202">sy2202</option>
            </select>
        </div>
        <div>
            <label>
                是否毕业 <input type="checkbox" v-model="isFinish">
            </label>
        </div>
​
        <div>
            <textarea name="" id="" cols="30" rows="10" v-model="desc"></textarea>
        </div>
        
        

7 修饰符

​
1 键盘修饰符
  @keydown
                .enter  键盘名称
                .13     keyCode
                .ctrl.enter  组件键
                
 2 v-model
                    .number  将数字字符串转化成数字   '110' -- > 110
                    .lazy    lazy默认执行事件oninput输入触发  懒 将v-model的事件变为 onChange[改变且失去焦点的时候触发]
                    .trim    去除首尾空格 
                    
 3 事件修饰符
     @click
              .stop -  阻止冒泡   调用 event.stopPropagation()。
        .prevent -   阻止默认     基本做原生上传会用到阻止默认   a  form表单  调用 event.preventDefault()。 
        .capture - 添加事件侦听器时使用 capture 模式。 改为捕获事件
                原生js里面怎么改为捕获
        .self - (只点击它本身的时候才会触发) 只当事件是从侦听器绑定的元素本身触发时才触发回调。
        .native - 监听组件根元素的原生事件。(*****)
        .once - 只触发一次回调。  div.onclick = null
        .passive - (2.3.0) 以 { passive: true } 模式添加侦听器 (滚动事件修饰符的时候使用)
        // 移动   touchstart touchend touchmove
        
 4 鼠标事件修饰符
     @mousedown
                .left - (2.2.0) 只当点击鼠标左键时触发。
        .right - (2.2.0) 只当点击鼠标右键时触发。
        .middle - (2.2.0) 只当点击鼠标中键时触发。

8 组件

函数。将一部分的代码,想什么时候使用的时候调用这个函数,并且可以通过传递的不容的内容是这个尽可能会多复用
函数 封装逻辑代码 
​
组件的意义  (页面的东西是由组件构成的)--- 组件当成函数
组件 ,将 html,css ,js 封装起来,有样式结构以及功能这么一个东西叫做组件,它也可复用,传递不同的数据去显示的不一样,达到通用效果
​

9 全局组件

// 参数1 组件的名字(不是使用关键字和保留字 也不用使用标签 标签形式调用组件) -- 函数的名字
// 参数2 options.  new Vue(options)
Vue.component('list',options)

<template id="home">
</template>
options = {
	data(){
		return {}
	},
	methods:{
	},
	template:"#home"
	template:"<div></div>"
}
组件注意事项
	1 template 只能有一个字元素
	2 data必须函数返回对象
	3 通信传参的时候 :才是动态属性  静态属性传的都是字符串
	4 传递的数据 通过props接收
	5 props接收的属性 不要在methods或者data里面定义 
	6 组件之间数据默认不能共享 , 父子组件值得数据默认不能共享

10 组件的data为什么是函数?

组件为什么要有函数,利用函数局部作用域,就是为加一个独立作用域,让它的数据独立,相互之间不影响,

1 函数的特点 ?
	1 调用
	2 作用域
	3 传参
	
function fn(a){
  console.log(a)
}

fn('java')   // 
fn("前端")   // "a"

11 组件通信 (就是想让这个数据可以相互之间使用)

//数据流向都是单向的,从上往下,不要妄想着在自组件改变父组件的数据,谁的数据,就让谁来修改的

1 父子通信,父组件的数据传递给子组件

 在组件上自定义属性 传递数据。传递多个
 <home color="green" :n="10" ></home>
 自组件内部 可以通过props接收
 props:['color','n']
 

12 props验证

验证这个东西是否是对的,不能帮你该改变 

1 props:['color','n']
2 props:{
	n:Number,
	color:{
	type:String,
	default:"red" //传递i就是你传递的值,不传递就是默认值
	},
	arr:Array,

}

13 生命周期

组件它创建到销毁的过程的函数叫做生命周期(钩子函数),自动执行,过时不候

1 挂载阶段的生命周期	(如果组件不销毁,就执行一次)
	
	// 创建前触发
		  beforeCreate(){}  //组件还没有被创建,所以不能够使用组件内部东西,不能够拿到组件的数据和方法
	// 创建后触发
		  created(){}  能调用内部的数据和方法 (等待着渲染) ajax
	// 挂载前触发
		  beforeMount(){}    也还没有渲染到页面上 还没有渲染到页面上 diff
	// 挂载后触发    真实dom节点  渲染完成  ajax
			mountd(){}    // 获dom,获取元素,初始化swiper 

2 更新阶段的生命周期  (初始化的不执行,数据更新的时候执行 (自父组件更新都执行))
  更新阶段的生命周期 ,更受限必须要 渲染过真实DOM, 必须要值完挂载阶段的声明周期 , 当你修改的时候
  购物车总价,邮费自动算的 可以使用
	beforeUpdate(){} 更新前触发
	updated(){} 更新后触发
	更新阶段有瑕疵,没有办法针对的监听某个值,从而任意值改变都执行,耗费性能


3 卸载阶段的生命周期 (销毁的时候执行) 作用就清除计时器 注销时间
	  beforeDestroy() {
    console.log('销毁前 -- beforeDestroy')
    },
    destroyed() {
      clearInterval(this.timer)
    }
                




14 虚拟DOM

所有的内容都是虚拟DOM, 真实DOM的对象节点,在渲染完成之前都是虚拟DOM节点,所以当我们去修改的时候,它查看修改前和修改后是否有变化,将变化的内容,记录,只修改变化的内容,那么没有改变的就略过了

真实DOM
			 div.box
			 		p ‘hello world'
			 		h2 'hello 1'
			 		
var dom1 = {
	 type:"div",
	 props:{class:"box"},
	 children:[
	 	{
	 	type:"p",
	 	props:{},
	 		children:["hello world"]
	 	},
	 	{
	 		type:"h2",
	 		props :{},
	 		children:["hello 1"]
	 	}
	 ]
}		 		
	
	//	更改后的
var dom2 = {
	 type:"div",
	 props:{class:"box"},
	 children:[
	 	{
	 	type:'p',
	 	props:{},
	 		children:["hello world1"]  //内容更新的时候需要更新
	 	},
	 	{
	 		type:"h2",
	 		props :{},
	 		children:["hello 1"]
	 	}
	 ]
}		 		
			

15 created和mounted

使用那个生命周期进行ajax请求
created,beforeMount,mounted , created最早的,
created 请求异步   beforeMount -- mounted -- (数据返回)   -- 渲染数据)  --- 渲染完成
无论哪个生命周期里面,都会渲染两次,ajax异步的数据,生命周期执行完之后数据才会返回

16 父组件和自组件生命周期

1 home(父) list(子) 怎么执行的?
	挂载阶段
		父 123  --->   子 1234   -->  父 4
	
2 更新阶段 
		必须都要渲染dom,否则监听不到 
		父 1 子 12 父2

17 watch

监听某一个值改变自动触发,取代了更新的生命周期

watch:{
	// 只适用于基本类型
	n(){
		// n改变的时候执行 (限制 n必须基本类型)
	},
	todos:{
		handler(){
					// 
					this.todo_start=
					this.todo_end= 
		},
		deep:true,
		immediate:true // 是否初始化的时候执行
	}
}

watch里面深度监听的deep做了什么?
    //基本类型和引用类型的区别
    引用类型的深拷贝和浅拷贝。, 如果浅拷贝怒 (拷贝了地址,所以改前和改后同一个地址,就监听不出来改变),所以加了deep:true,深拷贝了,或者 将对象值一一对比,将对象本身改变成字符进行比较

18 computed

监听改变自动计算出结果,不分引用类型和基本类型,返回值就是计算的结果
computed:{
// yf计算返回的结果,调用不需要() ,函数必须要return值
	yf(){
	 // 监听里面调用的值改变,
		return 值
	}
}

19 watch和computed的区别

优缺点和使用场景

 1 watch和computed 共同的特点,可以监听某个值改变,自定执行逻辑
 watch
 	分基本类型和引用类型两种监听好,监听的值,要作为函数名或者属性名,当这个值改变的时候会自动执行
 	watch 有触发间隔 ,相当于有截流的效果
 	***** 监听的函数里面可以执行异步 (可以请求数据)
 	watch 使用与 一个属性改变影响多个值
 	
 computed
  不分引用类型和基本类型,函数作为函数的值,调用的时候不需要(),必须要有返回值
  会将上一次的计算结果,进行缓存,下一次计算的时候从缓存里面获取
  ****** 函数里面不能够执行异步,不能够强求数据
  computed 多个值计算出一个结果
  
  ps 除了异步 其它情况下建议是用 computed  代码好维护

20 key的作用

key 给虚拟dom添加标记的,作用当我们改变数据的时候,可以同级通过唯一标记来进行比较,能够快的比较出是否改变,优化性能
同级保证唯一
<div key="1"></div>
<p key=2></p>
ul key=3
	li key=4

21 组件通信 重点

1 父子通信

 <home  :list="list" n=10></home>

 home组件里面
 props:{
 	list:Array,
 	n:number,
 	name:{
 	 type:String;
 	 default:"hello"
 	}
 }

2 子父通信 (封装组件里面比较多)

	1  利用父子通信传递函数的方法去做
	将父组件的方法传递给子组件,那么子组件调用这个方法的时候其实就是调用父组件的那个方法,这个时候我们在这个函数里传参,这个参数就是自组件的数据,父组件生命函数形参就可以接受到数据
	 <home  :list="list" n=10  del="delList"></home>
	 this.del(aaa) --- 父组件的函数。deList  -- delList(参数){}
	 
	 2 广播事件  推荐使用
	 	this.$emit('事件名称',参数)  
	 	<list @事件名称=‘callback'></list>
	 	callback 获取子组件的数据

3 事件总线 eventBus

  适用于多个组件事件共享数据,使用与 子传父组件类似, 都是利用$emit
  
  const bus = new Vue({})  //创建一个第三方势力对象
  bus.$emit("事件名",参数)
  bus.$on("事件名",callback(传递的参数))
  
  有问题 必须保证传递的时候组件是存在的,如果不存在监听不到, 页面组件之间使用eventBus就不好传递了,页面之间都是切换关系,只显示一个,当时传递的时候还没有创建呢
 

4 边界情况

遵循谁的数据让哪个组件自己去修改,不要在别的组件里面修改其它组件的数据
1 this.$parent 只能获取父组件的信息(直接获取)   
2 this.$children     获取子组件的集合   []
3 this.$root   获取根实例的信息

5 ref

 <home ref='home'></homew>
 this.$refs.home 获取组件信息     --  document.getElementById("")
 维护的时候不好维护 , mounted之后获取

6 插槽 -- 封装的组件上

利用slot在组件中展位,传递的时候在在组件标签中间传递,如果传递就slot位置显示
1 普通插槽
<Search>
	//插槽
	<button>按钮</button>
</Search>

Search.vue
	<div>
	<input /> <slot></slot>
	</div>

2 具名插槽
	slot组件的name值,与插槽的slot对应才能显示

  <slot name='before'></slot>
  <slot name='after'></slot>
  
  <Search>
      <select slot="before" name="" id="">
        <option value="2201">2201</option>
        <option value="2202">2202</option>
      </select>
      <button slot="after">搜搜</button>
    </Search>
    
    
  3 作用域插槽
  	能够访问到组件自己的内容
  	  <slot :val="val" :n="10" :enter="enter"></slot>  slot传递组件的数据或方法
  	  scope就是传递的数据对象
   <Search> 
      <template slot-scope="scope">  
        <div>
          <button @click="search(scope)">搜索</button>
        </div>
      </template>
    </Search>
    
    

22 脚手架安装项目

必须有node环境
如果出现  不是内部或者外部命令
	1 单词打错了
	2 没有安装成  
	3 环境变量有问题
	

	
node -v. 如果10 升级。安装 	16		或者 14




1 cnpm i @vue/cli -g  or npm i @vue/cli -g

2 查案是否安装完成
		vue --version
		如果出现 版本 @vue/cli 5.0.4  (出现这种字样就说明安装成功了)
	
3 创建项目
	   vue create  vue_study

4 进入目录 vue_study
	   npm run serve
	   
5 
 cnpm i 安装 package.json 里面记录的所有依赖


1 安装  cnpm i @vue/cli -g

2 vue --version 

3 vue create vue_study




23 局部组件

局部组件必须要注册才能使用 , 在哪个组件里面注册就只能在那个组件里面使用,利用components注册才能够使用

const demo = {
	data(){
		return {}
	},
	template:"#demo"
}

const home = {
  components:{
  	demo
  }
}

//组件分两种
// 使用一次  局部组件 (页面组件)(页面里面的某一部分)
// 使用多次  全局组件  (按钮,输入框,table)

全局组件耗性能

24 每一个文件

每一个js文件都是独立作用域,其它js都不能直接使用,方法和属性都是私有的,想要使用必须导出 , 其它调用必须倒入
每一个.vue 都是一个组件,也是独立的,其它想使用这个组件必须要 导出和导入

module.exports = a  ---->       require("./a")
export default.                import a from "./a"

25 项目目录

1 可能不是你创建项目 , 项目创建好了, 码云或者github上 , 没有node_modules,需要安装node_modules
2 node_modules 是这个项目的依赖(项目使用的插件)  scss es6 ..  jquery
3 拿到项目 看看 node_modules 安装依赖  cnpm i  or  npm i    
4 看package.json (启动项目 --- )
	 npm run serv 
 第二天发现启动不了了
   1 npm i  安装
   2 删除 node_modules cnpm i
   3 检查目录是否对
   
packpage.json 包管理文件 (很重)  
public   phpstudy 的 www 目录 服务器的静态资源目录
node_modules  依赖文件 github 码云 上传的忽略文件
readme.md  项目使用说明书 (自己写)
还有一堆其它的配置文件。暂时不讲
src 开发的文件夹 
	  

26 关于项目的一些问题

1 项目就找src的目录 
	该路径
	改文件夹名字
	
2 所有都会在App.vue 跟组件
	
3 错误 
 	1 路径有问题
  Module not found: Error: Can't resolve './views/Todo1.vue' in '/Users/element/Desktop/sy2201/vue_study/src'
  2 组件没有注册
    <Todo> - did you register the component correctly
    
  3 Missing script: "server"  npm run serve
  
  4 

27 路由

路由难度5* , 难点就是需要一定经验 能把这个东西做好, 容易出去各位同学 

vue 切换页面就使用路由 , 跳转页面不刷新,单页面应用, 不同的路径匹配不同的组件,路由页面和路径一定是一一对应
切换用的 <a herf=></a>. 跳转回刷新

http://127.0.0.1:8080/home
http://127.0.0.1:8080/center
										 /about

1 安装下载  cnpm i vue-router@3 --save
	卸载 cnpm uninstall vue-router@3 --save
	vue-router4 先不使用

2 在src/router/index.js
 //固定的
	import Vue from "vue" ; // "Vue" 错了
	import Router from "vue-router"
	Vue.use(Router)
	
	const routes = [
		{
		path:"/自定义"	,
	 	component:Home , components 错了
		}
	]
	
	const router = new Router({
		routes  // routers 错误
	})
  export default router
  
  
 3 main.js 
 	import router from "./router"
 	new Vue({
 		router, //传router给每一个组件
 	})
 
 4 App.vue
 	 <!--显示路由组件-->
 	 <router-view></router-view>

28 router-link

路径匹配的时候
http://127.0.0.1:8080/   -- home

http://127.0.0.1:8080/about  -- about
<router-link
    exact
    to=""
    :to="{}"
    activeClass    修改模糊样式的类
    exactActiveClass  修改精准匹配的类名
    replace      默认情况是push模式   -- replace没有后退记录了
    tag="li"
   >
</router-link>
		默认与两个样式。router-link-active. router-link-exact-active

29 动态路由传参

router-link :to="'/topic/'+item.id"
router/index.js
{
	path:"/topic/:id"  id是变量。 可以
}

topic组件里面 
this.$route.params 获取传递的参数  固定写法

1 路径传递
2 路由上配置
3 组件内部接收

30 css属性穿透

<style scoped>
/**
  
  设置的样式没起作用

  1 后添加进去的元素 不起作用  例如富文本
  2 在组件里面直接渲染的元素才能继承样式
  3 

*/
.content >>> p {
  color: red;
}

.content /deep/ p {
}
</style>

31 路由传参

<router-link :to="{path:'/路径',query:{key1:val1,key:val2}}">
接收
this.$route.query  获取到参数对象

动态路由传参 比较适合传递单个的值
路由传参比较适合 传递多个值,对象这种

// 动态路由 + query (你们试试)

32 编程式路由 $router

router-link --- 
js触发路由跳转 
this.$router.push('/about')
this.$router.push({
  path: "/about",
  query: { name: "banban", age: 20, sex: "男" },
});

this.$router.push() //跳转 有后退记录的  添加栈
this.$router.repalce() //跳转  无后退记录  二级可以需要加这个属性  替换当前栈
this.$router.history.go()  0  1 -1

33 嵌套路由

 {
    path: "/order",
    component: Order,
    meta: {
      til: "订单",
    },
    children: [
      {
        path: "/order/end", //  /order
        component: End,
        meta: {
          til: "已完订单",
        },
      },
      {
        path: "tui",
        component: Tui,
        meta: {
          til: "已退订单",
        },
        children:[]
      },
      {
        path: "pay",
        component: Pay,
        meta: {
          til: "代支付订单",
        },
      },
    ],
  },
  
  ps 
  	第一个 路径携带父极路径
  	要在父级组件里面写 router-view
  	三级路由都已经很麻烦 
  

34 重定向

  // /order. --- > /order/end
 {
        path: "/order",  
        redirect: "/order/end",   //冲定向位置
      },

35 路由懒加载

如果正常加载  当时用的或者不用的都加载了 ,导致首屏 加载时间过长 (都加载完成才能渲染视图)
总体时间可能没有变少,但是分步,提高了用户体验

骨架屏   饿了么
banner广告  -- 当然前

const About =()=> import("../views/about")
{
    path: "/me",
    component: () => import("../views/me"),
    meta: {
      til: "我的",
    },
  },

36 命名路由

{
 path:'/about',
 name:'about'
}
router-link :to="{name:'about',params:{}}"   
获取的时候。通过 this.$route.params 刷新不保留

命名路由传参 刷新时候数据不能保存住 (用处不大)

37 命名视图

<router-view></router-view>

{
path:"/"
components:{
	default:组件1,
	a:组件2
	b:组件3
 }
}

<router-view></router-view> deafult
<router-view name='a'></router-view>  路径匹配 组件2
<router-view name='b'></router-view>  路径匹配 组件3
<router-view name='c'></router-view> 不限时

38 导航守卫 路由的声明周期

全局钩子
// 路由跳转前触发
beforeEach((to,from,next)=>{
	 // to表示进入的路由信息
	 // from 表示从哪离开的路由信息
	 // next() 向下执行    next('/') next({path:"/"})
	 设置title
	 登陆验证 重点 
})
afterEach((to,from)=>{
  // 每次路由进入后触发
  
  很少单独使用  都和beforeEach一起使用比较多
  例如可以。beforeEach开启加载动画。  在afterEach 关闭加载动   做一个loadding
})

独享钩子  了解
beforeEnter:(to,from,next)=>{
	// 在路由对象对象配置上的钩子函数
	
}
组件内部钩子 了解
// 比beofreCrate更早
 beforeRouteEnter(to, from, next) {
    // ...
    //
    console.log("路由进入前触发");
    next();
  },
  beforeRouteLeave(to, from, next) {
    // ...
    console.log("路由离开的时候触发");
    next();
  },
  //  路由更新的时候才会触发 它会触发  watch:{$route}
  beforeRouteUpdate() {
    // 默认不触发 , 路由对象更新的时候触发
    路由信息发生改变才会触发
    console.log("路由更新的时候触发");
    next();
  }

39 路由模式 (暂缓)

mode:"hash" "history"
hash 模式
	带 #
history 模式 
 	不带 #

40 keep-alive 重点中的重点

路由组件都是切换的,一个显示其它组件都是销毁的,所以导致每次切换回来,之前组件都销毁需要重新初始化,所以还需从新创建从新发送请求,
keep组件包裹之后 组件不被销毁

正常使用使用过程中。
有些数据是实时的,如果实时的数据使用keep-alive 会导致页面不刷新

<keep-alive max="最大缓存页面数量" include='我要缓存的组件' exclude='不需要缓存的组件'>
	 <router-view></router-view>
</keep-alive>

1 区分组件缓存不缓存
  include='组件的name,组件的name' 
  exclude='组件的name,组件的name'
  
 2 设置了不缓存 ---
 	两种情况都需要的
 	 activated() {
    // 请求数据  -- 需要更新的改变的 在这里执行
    console.log("组件进入的时候触发");
    
    this.getTopic();
  },
  deactivated() {
    console.log("组件离开的时候触发");
  },
 	
  
  

40 vuex

一个vue的状态(数据)管理工具,多组件共享数据(组件之间不需要有什么关系),它相当于一个中间对象,所有的东西都是它自己的,我们页面只需要使用就可以了

 安装 cnpm i vuex@3 --save
 
 使用
 1 src/store/index.js.      
 	 import Vue from "vue";
    import Vuex from "vuex";
    Vue.use(Vuex);

    //你别下载

    const store = new Vuex.Store({
    	state, // 状态
    	mutations //修改状态的方法
    	getters // state它的计算属性。 computed
    	actions. // 可以提供上下文环 (异步修改state)
    });

    export default store;
    
  2 main.js
  	import store from "./store"
  	new Vue({
  		store,
  		router,
  	})

state

const state = {
	count:10,
	user:{}
}
this.$store.state[属性]  
// 帮助我们封装了一个对象 ...拓展出来就是原生的写法
import {mapState} from "vuex"

computed:{
	...mapState(['count','user'])  //数组里的属性一定要与 state里面属性一样,否则获取不到
}

mapState封装

function mapState1(arr) {
  let obj = {};
  arr.forEach((item) => {
    obj[item] = function () {
      return store.state[item];
    };
  });
  return obj;
}

console.log(mapState1(["count", "user", "b", "abc"]), "okokok");

mutations

唯一指定能修改state  如果想修改state 必须只能使用mutations的方法 
const mutations = {
// state 第一个参数
// payload 页面传递参数s
	ADD_COUNT(state,payload){
		 // 	执行逻辑
	}
}

this.$store.commit("ADD_COUNT",参数)

import {mapMutations} from "vuex"
methods:{
	...mapMutations(["ADD_COUNT"])
}

getters

state它的计算属性,state的数据改变改的时候自动执行,跟computed使用方法一摸一样
const getters ={
	todos_start(){
		return.   必须return
	}
}
// 
this.$store.getters.todos_start
import {mapGetters} from "vuex"

computed:{
	...mapGetters(['todos_start',....])
}

actions

可以提供上下文环境,让commit()提交的可能性更多, (发送ajax 执行异步) , 获取到回调到结果,然后提交commit 修改state

const actions = {
	login(context){
	
	   context 获取其它模块的数据 需要使用 context.rootState   .rootGetters
		 context 是 store 镜像
		 
		 // 发送登陆请求。-- 
		 // 看返回结果 , 如果对。 commit('SET_USER',payload) 修改state
		 // 否则 请求失败 提示失败
	}
}

this.$store.dispatch('login',参数)

import {mapActions} from "vuex"

methods:{
	...mapActions(["login"])
}

Modules

将数据进行模块化,方便管理 ,如果数据数据比较复杂,推荐使用modules

  modules: {
    user, // this.$store.user            
    todos, // this.$store.todos
  },
  
  模块里面调用自己的方法不需要加
  模块导出的时候 加上命名空间
  export default {
  namespaced: true, //加上之后调用 actions mutations 需要加上模块民意  this.$store.commit('user/ADD')
  state,
  actions,
  mutations,
};

plugins vuex数据本地存储

vuex的缺点是什么? 刷新的时候数据不保留?

安装  npm i vuex-persistedstate --save. 
 
 plugins: [
    Per({
      storage: window.sessionStorage,  //修改存储方法
      key: "sy2201", // 默认key vuex
      paths: ["user"], //默认都存储 设置存储那些属性 
    }),
  ],

vuex

vuex它是vue的状态管理工具,适用多组件之间共享数据,它有自己的一些属性,作用各不相同
state 存储状态
mutations 修改状态
getters  state的计算属性
actions  给修改state提供异步环境,我们一般在这里面可以发送请求
modules  它将数据进行模块 ,后期好维护
plugins  持久化存储

其实eventBus --- 
本地存储 共享比较不错 , 100 维护的时候不知道去哪改 

41 自定义指令

v-hide=""

全局 ---
  Vue.directive("drag", {
    bind(el, val) {
      el.onmousedown = function () {
        el.style.position = "absolute";
        document.onmousemove = function (e) {
          el.style.left = e.pageX + "px";
          el.style.top = e.pageY + "px";
        };
        el.onmouseup = function () {
          document.onmousemove = null;
        };
      };
    },

局部

42 自定义过滤器。

Vue.filter("toDouble",function(data){
	必须要返回值
	return 
})

{{10 | toDouble}}

43 axios

专门封装了ajax的一个插件,核心都XMLHttpRequest,它是一个promise的封装

cnpm i axios --save

使用的参照着 jquery

axios({
	url:"请求地址",
	method:"请求方式,
	headers:{}, ...
	params:{} //get
	data:{} 非get请求传参
}).then (res=>{}).catch(err=>)


使用
1 utils/request.js 
		二次封住那个 axios
2 api/index
	  将接口在这里创建 导出
	  
3  页面负责调用这些接口

44 token做用是什么

token 就是用户信息 (加密之后的用户信息) , 登陆之后获取的用户信息 , cnode 并没有给我们登陆接口,这个登陆接口是我自己写的,我是信息复制过来的,登陆之后可以拿的到

收藏 
 wshp891122 

UI框架

pc端    elment-ui
移动端   vant

1 cnpm i element-ui  --save  看官网

作业

创建一个cnode项目

内容左边。router-view.

内容右边。命名视图 router-view na me

倒计时 5秒时候后跳转

两个接口

1 店铺列表

[{...}]

2 店铺详情

/123. --- 通过id获取详情

作业

1搭建路由 写个三四遍

2昨天的选项卡 改成路由

3 主题列表渲染必须写

跳转详情页传参 渲染详情页面 可选

cnpm i @vue/cli -g 进入目录

cnpm i

cnpm run serve

路由 vue-router

vuex.

@vue/cli. 用它

axios

作业

 选项卡。
 	 <menu></menu>
 	 <content></content>
 	 
 todoList
 <Search></serach>
 <list></list>
 
 
 cnode 整明白了 

todolist

1 数据格式
	todoList:[
		{
		  done:false , //这在进行
		  text:"内容",
		  id:1
		},
			{
		  done:true , //这在进行
		  text:"内容1",
		  id:2
		}
	]
	
 2 <li v-for="item in  todoList" :key="item.id"> 以后在遍历的时候+key值
 
 3 
 	 todoList:[], 都有
 	 todo_start:[], flase  正在进行的   filter
 	 todo_end:[]  true. 已完成的		filter
 	 
 	 
 	 
2 手写生命周期

问问题

1) 降级  ---  (工作) --- ()
2) 基础 -- (着急)
	 完整 
	 		ajax() 
      组件通信 ()
 1  2   
 2
 3
 4
 5
 6
	
前端。
选项卡。 todolist  购物车


联系

作业 1
cnode首页的列表图

1 点击分类 让数据改变 
	全部   精华   问答

2 列表 List 


案例敲一一边

留言板
添加数据
   ...
	


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值