前端框架~VUE~day07 之 element-ui的使用、状态管理器、router使用、localstorage和sessionstorage,和cookie

VUE之element-ui的使用、状态管理器、router使用、多级路由、路由守卫、localstorage和sessionstorage,和cookie




提示:以下是本篇文章正文内容,下面案例可供参考

一、element-ui的使用

1.1、安装

npm install babel-plugin-component -D
cnpm install element-ui -S
这两种方式都是安装最新的版本

cnpm isntall -S element-ui@2.9.1
这是安装老版本

1.2、完整引用 Element(在 main.js 中写入以下内容)

import ElementUI from 'element-ui';  // 把对象引入
import 'element-ui/lib/theme-chalk/index.css';    // 把样式引入
Vue.use(ElementUI);

1.3、这样就可以在单页面组件中使用element-ui了

官方文档 https://element.eleme.cn/#/zh-CN/component/quickstart
参考文档:看到好看的样式,直接复制

以登录界面结合element-ui的使用

单页面组件页面的代码

<template>
  <div>
    <el-row :gutter="20">
      <el-col :span="16" :offset="6">
        <div class="grid-content bg-purple">
          <h1>登录页面</h1>
          <br>
          <el-row>
            <el-input v-model="username" placeholder="请输入用户名"></el-input>
            <br>
            <br>
            <el-input placeholder="请输入密码" v-model="password" show-password></el-input>
            <br>
            <br>
            <el-button type="primary">主要按钮</el-button>
            <el-button type="success">成功按钮</el-button>
          </el-row>

        </div>
      </el-col>
    </el-row>
  </div>
</template>


<script>


export default {
  name: 'HomeView',
  data() {
    return {
      username: '',
      password: '',
    }
  },

}
</script>


<style>
/* 下面的是页面布局的样式  */
.el-row {
  margin-bottom: 20px;

&
:last-child {
  margin-bottom: 0;
}

}
.el-col {
  border-radius: 4px;
}

.bg-purple-dark {
  background: #99a9bf;
}

.bg-purple {
  background: #d3dce6;
}

.bg-purple-light {
  background: #e5e9f2;
}

.grid-content {
  border-radius: 4px;
  min-height: 36px;
}

.row-bg {
  padding: 10px 0;
  background-color: #f9fafc;
}
</style>

main.js 文件的代码

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


Vue.config.productionTip = false

//elementui 的引入
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);


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

效果展示
在这里插入图片描述

二、状态管理器(vuex)

2.1、vuex的使用

2.1.1、概念

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

2.1.2、何时使用?

多个组件需要共享数据时
在这里插入图片描述

2.1.3、vuex环境

在项目的src文件夹下的store文件夹下的index.js文件里面
在这里插入图片描述

2.1.4、vuex的三种使用方式

vuex的代码

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

Vue.use(Vuex)

export default new Vuex.Store({
    state: {
        num: 10
    },
    mutations: {
        // mutations 写函数的功能
        mAdd(state, count) {
            console.log(state)
            console.log(count)
            state.num = state.num + count
        },
    },
    actions: {
        // 至少要有一个参数,context上下文对象,触发mutations中函数执行,或者直接改state中数据都可以
        add(context, count) {
            // 使用commit,触发mutations中得函数
            console.log(context)
            console.log(count)
            context.commit('mAdd', count)  // 会触发mutations中得mAdd的执行
        },
    },
})

  • 页面组件的代码
  1. 直接操作
<template>
  <div>
  <h1>vuex的使用</h1>
    购物车商品数量:{{this.$store.state.num}}
    <button @click="handclick">点击我增加数据</button>
  </div>
</template>


<script>


export default {
  name: 'HomeView',
  methods: {
    handclick(){
      // 1、直接操作
      this.$store.state.num +=1
    },
  },

}
</script>

<style>

</style>
  1. 正统方式
<template>
  <div>
  <h1>vuex的使用</h1>
    购物车商品数量:{{this.$store.state.num}}
    <button @click="handclick">点击我增加数据</button>
  </div>
</template>


<script>


export default {
  name: 'HomeView',
  methods: {
    handclick(){
      // 2、正统方式
      // add 必须是action中得函数
      this.$store.dispatch('add', 2)
    },
  },

}
</script>

<style>

</style>
  1. 直接操作mutations
<template>
  <div>
  <h1>vuex的使用</h1>
    购物车商品数量:{{this.$store.state.num}}
    <button @click="handclick">点击我增加数据</button>
  </div>
</template>


<script>


export default {
  name: 'HomeView',
  methods: {
    handclick(){
      // 3、直接操作mutations
      this.$store.commit('mAdd', 3)
    },
  },

}
</script>

<style>
</style>
  1. 实现的效果

在这里插入图片描述

三、router使用(重点)

提倡单页面应用,需要做页面的跳转----》借助于Router实现页面组件的跳转

3.1、路由创建的三种方式

3.1.1、简单的路由创建和使用

步骤:
创建一个新的页面组件在views文件夹下面创建
在这里插入图片描述在router—>index.js—>routes数组中加入一个路由即可
在这里插入图片描述
实现效果
在这里插入图片描述

3.1.2、组件中实现页面跳转

-两种方式
	-方式一:使用 router-link 标签,to 地址
     	<router-link to="/about"></router-link>
	-方式二:js控制
    	this.$router.push('/about')

方式一:使用 router-link 标签,to 地址

单页面组件的代码:

<template>
  <div>
    <h1>我是首页</h1>
    <p>只要是在router-link标签下的内容都会被点击跳转到to指定的页面如:按钮、文本内容、图片</p>
    <router-link to="/about">
      <button>点击跳转到about路径下</button>
      <p>文本内容</p>
      <img src="https://img2.woyaogexing.com/2021/09/22/d9e5c102207f490b883e034db8657244!400x400.jpeg" alt=""
           height="200px">
    </router-link>
  </div>
</template>


<script>


export default {
  name: 'HomeView',
  methods: {},
}
</script>


<style>


</style>

要跳转到的单页面组件的页面代码:

<template>
<div>
  <h1>我是about页面</h1>
</div>
</template>

<script>
export default {
  name: "AboutView"
}
</script>

<style scoped>

</style>

实现效果
在这里插入图片描述
跳转之后的页面
在这里插入图片描述

方式二:js控制

单页面组件的代码:

<template>
  <div>
    <h1>我是首页</h1>
    <br>
    <br>
    <br>
    <button @click="clickGo">js控制跳转到about</button>
    <br>
  </div>
</template>

<script>
export default {
  name: 'HomeView',
  methods: {
    clickGo() {
      this.$router.push('/about')
    }
  }
}
</script>

<style>
</style>

要跳转到的单页面组件的页面代码:

<template>
<div>
  <h1>我是about页面</h1>
</div>
</template>

<script>
export default {
  name: "AboutView"
}
</script>

<style scoped>
</style>

实现效果
在这里插入图片描述
跳转之后的页面
在这里插入图片描述

3.1.3、组件中实现页面跳转之对象属性

3.1.3.1、 通过对象跳转路由name形式:
 通过对象跳转路由name形式: <router-link :to="{name:'about'}">
<template>
  <div>
    <h1>我是首页</h1>
    <p>to标签可放对象</p>
    <!--   to前面加冒号然后用字典的形式填写to的k和v的值,这里的k和v的值是路由里面的kv键值对, -->
    <router-link :to="{name:'about'}">
      <button>点击跳转到about路径下</button>
      <p>文本内容</p>
      <img src="https://img2.woyaogexing.com/2021/09/22/d9e5c102207f490b883e034db8657244!400x400.jpeg" alt=""
           height="200px">
    </router-link>
  </div>
</template>

<script>
export default {
  name: 'HomeView',
  methods: {}
</script>

<style>
</style>
3.1.3.2、 通过对象跳转路由path形式:
通过对象跳转路由path形式: ‘<router-link :to="{path:'/about'}">
<template>
  <div>
    <h1>我是首页</h1>
    <p>to标签可放对象</p>
    <!--   to前面加冒号然后用字典的形式填写to的k和v的值,这里的k和v的值是路由里面的kv键值对, -->
    <router-link :to="{path: '/about'}">
      <button>点击跳转到about路径下</button>
      <p>文本内容</p>
      <img src="https://img2.woyaogexing.com/2021/09/22/d9e5c102207f490b883e034db8657244!400x400.jpeg" alt=""
           height="200px">
    </router-link>
  </div>
</template>

<script>
export default {
  name: 'HomeView',
  methods: {}
</script>

<style>
</style>
3.1.3.3、 对象中可以有query属性,是个对象类型,会把里面的key-value拼到路径后面
# 这两种写法一样
<router-link to="/about?name=lqz&age=19">
<router-link :to="url_obj">

单页面组件的代码:

<template>
  <div>
    <h1>我是首页</h1>
    <p>to标签可放对象</p>
    <!--   to前面加冒号然后用字典的形式填写to的k和v的值,这里的k和v的值是路由里面的kv键值对, -->
<!-- 对象中可以有query属性,是个对象类型,会把里面的key-value拼到路径后面   -->
<!--    <router-link to="/about?name=lqz&age=19">-->
    <router-link :to="url_obj">

      <button>点击跳转到about路径下</button>
      <p>文本内容</p>
      <img src="https://img2.woyaogexing.com/2021/09/22/d9e5c102207f490b883e034db8657244!400x400.jpeg" alt=""
           height="200px">
    </router-link>
  </div>
</template>


<script>
export default {
  name: 'HomeView',
  data() {
    return {
      url: '/about',
      url_obj: {
        path: '/about', query: {
          id: 1,
          age: 19
        }
      }
    }
  },
  
</script>

<style>
</style>

要跳转到的单页面组件的页面代码:

<template>
  <div>
    <h1>我是about页面</h1>
  </div>
</template>

<script>
export default {
  name: "AboutView",
  created() {
    console.log(this.$route) // 对象,表示当前路由对象,里面有当前路径的地址,携带的参数。。。
    console.log(this.$router) // 对象,new VueRouter的对象,它主要用来做路由跳转
    // 地址栏中的数据
    console.log(this.$route.query)
  }
}
</script>

<style scoped>

</style>
console.log(this.$route)   // 对象,表示当前路由对象,里面有当前路径的地址,携带的参数。。。
console.log(this.$router)  // 对象,new VueRouter的对象,它主要用来做路由跳转
console.log(this.$route.query)  // 地址栏中的数据
# 这三行打印的是下面的图片的结果

展示
在这里插入图片描述

3.1.3.4、 在另一个页面中取出地址栏中数据:console.log(this.$route.query)

要跳转到的单页面组件的页面代码:

<template>
  <div>
    <h1>我是about页面</h1>
  </div>
</template>

<script>
export default {
  name: "AboutView",
  created() {
    console.log(this.$route) // 对象,表示当前路由对象,里面有当前路径的地址,携带的参数。。。
    console.log(this.$router) // 对象,new VueRouter的对象,它主要用来做路由跳转
    console.log(this.$route.query)   // 地址栏中的数据
  }
}
</script>

<style scoped>

</style>
    注意区分:
    	this.$route:当前路由对象,当前路径,取传递数据。。。
        this.$router:整个路由对象,主要做跳转用
3.1.3.5、 这种传递方式和 3的方式一样
这种传递方式和 3  一样  <router-link to="/about?name=lqz&age=19">
<template>
  <div>
    <h1>我是首页</h1>
    <p>to标签可放对象</p>
    <!--   to前面加冒号然后用字典的形式填写to的k和v的值,这里的k和v的值是路由里面的kv键值对, -->
    <!-- 对象中可以有query属性,是个对象类型,会把里面的key-value拼到路径后面   -->
    <!-- <router-link :to="url_obj"> -->
    <router-link to="/about?name=lqz&age=19">

      <button>点击跳转到about路径下</button>
      <p>文本内容</p>
      <img src="https://img2.woyaogexing.com/2021/09/22/d9e5c102207f490b883e034db8657244!400x400.jpeg" alt=""
           height="200px">
    </router-link>
  </div>
</template>

<script>
export default {
  name: 'HomeView',
  data() {
    return {
      url: '/about',
      url_obj: {
        path: '/about', query: {
          id: 1,
          age: 19
        }
      }
    }
  },
</script>

<style>
</style>
3.1.3.6、 路径中分割出 参数

路由配置

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

// 导入创建的单页面组件
import AboutView from "@/views/AboutView.vue";
import DetailView from "@/views/DetailView.vue";

Vue.use(VueRouter)

const routes = [
    {
        path: '/',
        name: 'home',
        component: HomeView,
    },
    //  注册新建的单页面组件的路由
    {
        path: '/about',
        name: 'about',
        component: AboutView,
    },
    {
        path: '/detail/:pk',
        name: 'detail',
        component: DetailView
    },
]

const router = new VueRouter({
    mode: 'history',
    base: process.env.BASE_URL,
    routes
})

export default router

单页面组件的代码:

<template>
  <div>
    <h1>我是首页</h1>
    <br>
    <br>
    <h1>路径中分割出 参数</h1>
    <router-link :to="{name:'detail',params:{pk:88}}">
      <button>跳转到detail</button>
    </router-link>

  </div>
</template>

<script>
export default {
  name: 'HomeView',
  },

</script>

<style>
</style>

要跳转到的单页面组件的页面代码:

<template>
  <div>
    <h1>详情</h1>
  </div>
</template>

<script>
export default {
  name: "DetailView"
}
</script>

<style scoped>

</style>

效果展示
在这里插入图片描述

3.1.4、总结:

# 提倡单页面应用,需要做页面的跳转----》借助于Router实现页面组件的跳转


# 1 简单使用
	-页面跳转(咱们之前学过了)
    -写个页面组件
    -在router--->index.js--->routes数组中加入一个路由即可
    
# 2 组件中实现页面跳转
	-两种方式
    	-方式一:使用 router-link 标签,to 地址
         	<router-link to="/about"></router-link>
		-方式二:js控制
        	this.$router.push('/about')
            
            
            
# 3 路由跳转时,可以使用对象
	-1  通过对象跳转路由name形式: <router-link :to="{name:'about'}">
	-2 通过对象跳转路由path形式: <router-link :to="{path:'/about'}">
    -3 对象中可以有query属性,是个对象类型,会把里面的key-value拼到路径后面
    -4 在另一个页面中取出地址栏中数据:console.log(this.$route.query)
    -5 这种传递方式和 3  一样 <router-link to="/about?name=lqz&age=19">
    -6 注意区分:
    	this.$route:当前路由对象,当前路径,取传递数据。。。
        this.$router:整个路由对象,主要做跳转用
        
    -7 路径中分割出 参数
    	-配置:    
        	{
            path: '/detail/:pk',
            name: 'detail',
            component: DetailView
        	},
        -在路由中取:
        	this.$route.params.pk
            
    -8 路由跳转时,使用 7 的样子
    	-this.$router.push({name: 'detail', params: {pk: 999}})
        -<router-link :to="{name:'detail',params:{pk:88}}">
        
        
 # 4 this.router 的一些方法
    this.$router.push(path): 相当于点击路由链接(可以返回到当前路由界面)
    this.$router.replace(path): 用新路由替换当前路由(不可以返回到当前路由界面)
    this.$router.back(): 请求(返回)上一个记录路由
    this.$router.go(-1): 请求(返回)上一个记录路由
    this.$router.go(1): 请求下一个记录路由

3.1、多级路由

# 使用步骤:
	- 1 新建一个页面组件(LqzView),配置路由
    	  {
            path: '/lqz',
            name: 'lqz',
            component: LqzView,
        },
    -2 在页面中,想再显示页面组件,实现点击切换的效果
    	   <h1>lqz页面</h1>
            <router-link to="lqz01">
              <button>lqz-01</button>
            </router-link>
            <router-link to="lqz02">
              <button>lqz-02</button>
            </router-link>

            <router-view>
            # 以后这里变换页面组件,多级路由
            </router-view>
    -3 新建两个页面组件,Lqz01.vue,Lqz02.vue,配置路由children
        {
            path: '/lqz',
            name: 'lqz',
            component: LqzView,
            children: [ //通过children配置子级路由
                {
                    path: 'lqz01', //此处一定不要写:/news
                    component: Lqz01
                },
                {
                    path: 'lqz02',//此处一定不要写:/message
                    component: Lqz02
                }
            ]
        },

案列演示:
创建3个单页面组件,LqzView.vue、Lqz01.vue、Lqz02.vue,Lqz01.vue和Lqz02.vue用来做跳转路由用的。

路由配置的代码

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

// 导入创建的单页面组件

import LqzView from "@/views/LqzView.vue";
import Lqz01 from "@/views/lqz/Lqz01.vue";
import Lqz02 from "@/views/lqz/Lqz02.vue";


Vue.use(VueRouter)

const routes = [
    {
        path: '/lqz',
        name: 'lqz',
        component: LqzView,
        children: [ //通过children配置子级路由
            {
                path: 'lqz01', //此处一定不要写:/news
                component: Lqz01
            },
            {
                path: 'lqz02',//此处一定不要写:/message
                component: Lqz02
            }
        ]
    },
]

const router = new VueRouter({
    mode: 'history',
    base: process.env.BASE_URL,
    routes
})

export default router

LqzView.vue文件的代码

<template>
  <div>
    <h1>lqz页面</h1>
    <router-link to="lqz01">
      <button>lqz-01</button>
    </router-link>
    <router-link to="lqz02">
      <button>lqz-02</button>
    </router-link>

    <router-view>
      # 以后这里变换页面组件,多级路由
    </router-view>
  </div>
</template>

<script>
export default {
  name: "LqzView"
}
</script>

<style scoped>

</style>

Lqz01.vue和Lqz02.vue文件的代码

######################## Lqz01.vue文件的代码  
<template>
  <div>
    <h1>这个是lqz01页面</h1>
  </div>
</template>

<script>
export default {
  name: "Lqz01"
}
</script>

<style scoped>

</style>




####################################################Lqz02.vue文件的代码  
<template>
  <div>
    <h1>这个是lqz02页面</h1>
  </div>
</template>

<script>
export default {
  name: "Lqz02"
}
</script>

<style scoped>

</style>

效果展示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2、路由守卫

写在router-index.js中,以后访问任意一个路由,都会执行这个代码

# 前置路由守卫,再进入路由之前做判断
# 写在router-index.js中,以后访问任意一个路由,都会执行这个代码
router.beforeEach((to, from, next) => {
    console.log('前置路由守卫', to, from)
    // 要是访问lqz01,都不能跳转'
    // 如果没有登录,不能访问
    if (to.path == '/lqz/lqz01') {
        alert('你灭有权限')
    } else {
        next()
        // 继续访问
    }
})

展示效果
在这里插入图片描述

四、路由的两种工作模式

'''
路由器的两种工作模式
1 对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值。
2 hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器。
3 hash模式:
    地址中永远带着#号,不美观 。
    若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。
    兼容性较好。
4 history模式:
    地址干净,美观 。
    兼容性和hash模式相比略差。
    应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题

5 修改路由器的两种工作模式在 src的router的index.js文件中的 router的变量里面修改
const router = new VueRouter({
    mode: 'history',   // 修改 mode的值
    base: process.env.BASE_URL,
    routes
})


'''

四、localstorage和sessionstorage,和cookie

'''
# 前端存储数据
	- 登录成功,有token,存本地
    - 不登陆加购物车
    
# 前端可以存数据的位置:
	localstorage:永久存储,除非你删除,关闭浏览器,再打开还会在
    sessionstorage:只在当前会话生效,关闭浏览器,就没了
    cookie:有过期时间,到了过期时间,自动删除
    
# 操作这三个位置

1、操作cookie时需要第三方模块使用
      // 需要借助于第三方  vue-cookies
      // cnpm install -S vue-cookies
2、在main.js文件中导入模块
// 使用vue-cookies
import cookies from 'vue-cookies'
Vue.use(cookies)

3、这样就可以在单页面组件中使用

'''

单页面组件的代码

<template>
  <div>
    <h1>操作localstorage,永久存储</h1>
    <button @click="addLocalstorage">增加</button>
    <button @click="getLocalstorage"></button>
    <button @click="deleteLocalstorage">删除</button>
    <br>
    <br>
    <br>
    <h1>操作sessiostorage,当前会话,关闭浏览器</h1>
    <button @click="addSessiostorage">增加</button>
    <button @click="getSessiostorage"></button>
    <button @click="deleteSessiostorage">删除</button>
    <br>
    <br>
    <br>
    <h1>操作cookie,有过期时间, 需要借助于第三方模块</h1>
    <button @click="addCookie">增加</button>
    <button @click="getCookie"></button>
    <button @click="deleteCookie">删除</button>

  </div>
</template>


<script>


export default {
  name: 'HomeView',
  methods: {
    // 操作localstorage
    addLocalstorage() {
      var userinfo = {name: 'lqz', age: 19}
      localStorage.setItem('userinfo', JSON.stringify(userinfo))
    },

    getLocalstorage() {
      var userinfo = localStorage.getItem('userinfo')
      // console.log(JSON.parse(userinfo).name)
      console.log(JSON.parse(userinfo))
    },

    deleteLocalstorage() {
      localStorage.clear()
      localStorage.removeItem('userinfo')
    },

    // 操作sessiostorage
    addSessiostorage() {
      var userinfo = {name: '彭于晏', age: 19}
      sessionStorage.setItem('userinfo', JSON.stringify(userinfo))

    },
    getSessiostorage() {
      var userinfo = sessionStorage.getItem('userinfo')
      console.log(JSON.parse(userinfo).name)

    },
    deleteSessiostorage() {
      sessionStorage.clear()
      sessionStorage.removeItem('userinfo')

    },

    //
    addCookie() {
      // 需要借助于第三方  vue-cookies
      // cnpm install -S vue-cookies
      this.$cookies.set('name', '刘亦菲', '300s')

    },
    getCookie() {
      console.log(this.$cookies.get('name'))

    },
    deleteCookie() {
      this.$cookies.remove('name')

    },


  },
}
</script>


<style>
</style>

main.js文件的代码

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


Vue.config.productionTip = false

//elementui 的引入
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);

// 使用vue-cookies
import cookies from 'vue-cookies'
Vue.use(cookies)

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

展示效果
在这里插入图片描述


总结

以上就是今天要讲的内容,本文仅仅简单介绍了vue路由的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值