纯净的Vue项目

# 安装依赖
cnpm install
# 做成纯净的vue项目
-第一步:在router 的index.js 中删除about的路由
-第二步:删除所有小组件和about页面组件
-第三步:App.vue 只留
    <template>
    <div id="app">
           <router-view/>
           </div>
           </template>

补充:
App running at:
- Local: http://localhost:8080/
- Network: http://192.168.1.119:8080/
终端下的这两个路由分别代表的是本机地址/网络地址

Vuex的使用

# Vuex是vue的插件,增强了vue的功能。
在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信

# Vuex的使用流程
	-state:存数据的地址
    -actions:服务员,中转站
    -mutations:厨师,真正改state数据的地方
    
# Vuex使用步骤:
    	1 在state中定义变量
        2 在组件中通过this.$store.dispatch('actions中定义的函数'),触发actions中得函数执行
        3 在actions中得函数中,调用 context.commit('mutations中定义的函数')
        4 在mutations中定义的函数实现真正的修改state中得数据
        5 页面中只要使用$store.state.变量,变量变化,页面就变化  实现了组件间通信
		6 注意:
        	-在组件中可以直接调用commit触发【mutations中定义的函数】
            -在组件中可以直接修改state中定义变量
            
# Vuex使用示例:
1 安装,新建store/index.js

2 在index.js 中写
        export default new Vuex.Store({
            state: {
                # 放数据
            },

            mutations: {
                # 放方法,正常是让actions中来调用
                # 组件也可以直接调用

            },
            actions: {
                # 放方法,正常组件调用
            }
        })
        
3 在组件中
    	-显示state的变量
        html中:
          {{$store.state.变量名}}
        js中:
        	this.$store.state.变量面
        改state中的值
        
    -推荐按正常步骤:
        1. this.$store.dispatch('actions中的方法',参数)
        2.actions中的方法调用context.commit('mutations',参数)
        3.在mutations中直接修改state的值
    
    -也可以跨过任何一步,直接使用commit或者直接修改state:
        this.$store.commit()
        this.$store.state.变量名			


vuex的执行流程图

从左边的Vue Components(Vue组件)开始看。
Backend API:后端接口
Devtools:在浏览器可以装一个Vue调试插件。可以看到Vue组件。
VueX有三个状态Actions,Mutations,State。
在组件的数据通过调用dispatch放入Vuex状态管理器,进入actions状态,在actions状态调用commit,进入Mutations状态,在Mutations调用Mutate实现真正的修改数据。
比如组件向修改一个变量的数据,需要先通过actions的逻辑判断,判断当前组件是否允许修改数据。actions可以向后端发请求,判断当前用户是否有权限。
在一些情况下,Vue组件可以跨过Actions状态,直接通过Mutations修改数据。
image.png

image.png

Vuex的使用

由于我们创建项目的时候自动安装了Vuex,所以会有一个store文件,在此文件夹下有index.js查看其代码

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

在main.js注册
image.png

补充,在main.js这个vue对象中传入store:"xiaoming"属性
在根组件 created方法 打印this

Vue急速入门-6-小白菜博客
总结:也就是说在main.js里的这个Vue对象里添加的属性,以后再任意组件中都可以通过$属性名的方式获取。
所以Vuex就是将自己的对象放入了$store供所有组件使用(this.$store):

而这个对象,就是从store/index.js导出的那个对象:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

数据交互方式:

image.png

state:真正存数据的
mutations:修改state的地址 state.变量名,修改即可
actions:判断,跟后端交互,调用mutations的地方  context.commit

如何查看组件中State的变量:

我们可以在组件中显示state的变量
html中:
	{{$store.state.变量名}}
js中:
	this.$store.state.变量名

如何更改state中的值:

推荐按正常步骤
1. this.$store.dispatch('actions中的方法',参数)
2. actions中的方法调用 context.commit('mutations',参数)
3. 在mutations中直接修改state的值             
可以跨过任何一步(但最好按照流程编写)             	
    this.$store.commit() 
    this.$store.state.变量名

VueRouter

  • Router:官方提供用来实现spa的 vue插件
  • 实现了单页面应用,就是在一个index.html中页面切换有跳转效果
  • 本质上是做了路由的控制

基础使用
创建vue项目时,自定义选项选择了Router即可直接使用Router
如果之前没有安装的话:

npm install vue-router --save

在项目中创建router包,写个index.js,把下方的代码copy过来

import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
// 以后添加路由,就是模仿上面的home写对象,导入vue文件,更改路由路径,然后写上对应的vue文件名称
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  // 这里跟我们创建时候的配置选项有关,有一个地方询问我们是否开始这个历史模式,还有一个配置是询问我们项目依赖在哪个位置
  routes
  // 这就是我们上面定义的存储路由信息的数组
})

export default router
// 这里我们把VueRouter产生的对象导出

main.js中也需要进行注册:

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'

Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

路由需要有对应的vue视图组件进行搭配!

路由跳转两种方式
<router-link>   跳转用    
<router-view/>  替换页面组件用

我们可以在app.vue中看到,之前我们也介绍过它们的作用

// 点击跳转路由两种方式
js控制
this.$router.push('路径')
标签控制
  <router-link to="/home">
  <button>点我跳转到home页面</button>
  </router-link>

js控制实现登录跳转代码

<template>
  <div>

    <button @click="goLogin">点我跳转到登录</button>

  </div>
</template>

<script>


export default {
  name: 'HomeView',
  data() {
    return {
      obj: {name: 'login', query: {name: 'xiaoming'}, params: {id: 999}}
    }
  },
  methods: {
    goLogin() {
      // js 控制的跳转 ,跳转到login页面
      this.$router.push('/login/')
    }
  },
}
</script>
代码 作用
this.$router.push(path): 相当于点击路由链接(可以返回到当前路由界面)
this.$router.replace(path): 用新路由替换当前路由(不可以返回到当前路由界面)
this.$router.back(): 请求(返回)上一个记录路由
this.$router.go(-1): 请求(返回)上一个记录路由
this.$router.go(1): 请求下一个记录路由

标签控制实现路由跳转

<template>
  <div>

    <router-link :to="/login">
      <button>点我跳转到登陆页面</button>
    </router-link>
   
   </div>
</template>

<script>


export default {
  name: 'HomeView',
  data() {
    return {
      obj: {name: 'login', query: {name: 'xiaoming'}, params: {id: 999}}
    }
  },
}
</script>

区分this.$route this.$router

#4 区分this.$route  this.$router
    -this.$router #   new VueRouter对象,实例,可以实现路由的跳转
    -this.$route  #   是当前路由对象,内部有传入的参数

image.png

路由跳转,携带数据的两种方式

/course/?pk=1  带在路径中使用 ? 携带 数据 
/course/1/     路径中分割的数据

我们可以使用对象来携带参数
js控制实现路由跳转

  • 第一种方式:/course/?pk=1(这样进行路由跳转,路由会变成这样)
      this.$router.push({
        name: 'login',
        query: {
          name: 'lqz',
          age: 19
        },
          })
  • 第二种方式:/course/1/ (这样进行路由跳转,路由会变成这样)
      this.$router.push({
        name: 'login',
        params: {
          id: 88
        }
      })

标签实现路由跳转

我们可以在标签上把to这里设置成属性指令,让他传入一个对象,在对象中携带数据
规律也是跟上面js跳转一样的,携带了params的跳转需要在路由层更改路由,
没有携带params的跳转会用?号在路由后面携带数据

监听属性/计算属性

computed 的配置项中编写计算属性
	配置项中的写法:
计算属性需要在setup中导入
let fullName = computed(()=>{return firstName+lastName})

计算属性可以改值
let fullName = computed(()=>{return firstName+lastName})
set(newValue){
            
        }
    })
监听属性
	配置项写法:
-要写在setup中,函数,导入用
watch(变量,()=>{
    #变量发生变化就会执行箭头函数
})
watchEffact(()=>{
    #使用变量发生变化,这里就会执行
})

生命周期

# Vue3.0中可以继续使用Vue2.x中的生命周期钩子,但有有两个被更名:
-     vue2                         vue3       
    beforeCreate  	 ===>	    beforeCreate
    created       	 ===>	    created
    beforeMount 	 ===>	    beforeMount
    mounted	         ===>		mounted
    beforeUpdate	 ===>	    beforeUpdate
    updated 		 ===>       updated
    beforeDestroy 	 ===>		beforeUnmount
    destroyed 		 ===>	    unmounted
    
    beforeDestroy ===改名为===>  beforeUnmount
    destroyed     ===改名为===>  unmounted
    
# Vue3.0也提供了 Composition API 形式的生命周期钩子,与Vue2.x中钩子对应关系如下:
        beforeCreate	===>	setup()
        created		    ===>	setup()
        beforeMount 	===>	onBeforeMount
        mounted		    ===>	onMounted
        beforeUpdate	===>	onBeforeUpdate
        updated 	    ===>	onUpdated
        beforeUnmount   ===>	onBeforeUnmount
        unmounted 	    ===>	onUnmounted
        
# 以前写在created中的代码,现在直接写在setup开始即可
 let show = ref(false)
 axios.get().then(res=>{
      show.value=res.data.show
 })

toRefs

相当于解压赋值的感觉

# 以后setup的返回值可以直接使用
  setup() {
    let data = reactive({
      name: 'xiaoming',
      age: 19,
      gender: '男'
    })
    return {...toRefs(data)}
  }
# 以后在模板中直接用  {{name}}
export default {
  name: 'App',

  setup() {
    let data = reactive({
      name: 'lqz',
      age: 19,
      isShow: true
    })

    function handleShow() {
      console.log('ssdaf')
      data.isShow = !data.isShow
      data.age++
    }

    return {
      ...toRefs(data),
      handleShow
      // data
    }

  }
}