vue插件介绍、集成axios、elementui

439 阅读3分钟

上节内容回顾

# 1 计算属性
	-属性放在data配置项中,方法放在methods中
    -computed:{
        方法名(){}
    }
    -把它当属性用,缓存:只有当该计算属性使用的变量发生变化时,它才重新运算
    
    
# 2 重写过滤案例
# 3  监听属性
	-当属性发生变化时,触发某个函数的执行
    -watch:{
        page(){
            
        }
    }
# 4 组件:有自己的html,css,js,以后相用,直接注册使用即可
	-全局,局部
    -var child={template:``,data(){return {}},methods:{}}
	-组件中注册:components:{child}
    
# 5 组件间通信-组件间数据,方法都是隔离的
	-父传子:自定义属性
        <child :myname='lqz'></child>
        -在子组件中:props:['myname']
        
    -子传父:自定义事件
    	-子组件中某种情况下把子组件的数据传给父组件
        <child @myevnet='handleClick'></child>
        -点击事件函数内部:this.$emit('自定义事件名字',name)
        
        
    -ref属性:
    	-放在普通标签上: this.$refs.标签上的名字  原生dom对象
        -放在组件上:this.$refs.组件上的名字       组件对象  它有变量,方法
    
 # 6 动态组件
	-不确定显示的组件是什么,动态变化的
    <component :is='变量'></component>
    -<keep-alive></keep-alive>
    
# 7 插槽
	-写了组件,组件内部,空一个位置 <slot></slot>
    -<child >   <div></div>  </child>
    
    -默认插槽
    -具名插槽:挖多个坑,给每个坑命个名
    <slot name="b"></slot>
    
    
    <child >   <div slot="b"></div>  </child>
    <child >   <div v-slot:b></div>  </child>
    
# 8 vue-cli 
	-对比djagno,创建djagno项目需要怎么做?
    	-装python解释器,安装模块django,django-admin创建项目
    
    -nodejs,安装模块vue-cli
    	-npm install @vue/cli -g
        -vue 可执行文件
        -vue create项目名
        	-bable
            -vuex
            -vue-router
            
    -编辑器选择
    	-jetbrains公司:Pycharm,goland,phpstorm,IDEA,webstorm
    		-pycharm+vue插件  开发前端
        -vscode:微软出的,轻量级,免费
		-eclipse my eclipse
        -谷歌买了jetbrains授权, AndroidStadio
        -sublime Text
        -vim+插件
    
    -vue项目运行的两种方式
    	-命令行中执行:npm run serve
        -pycharm的绿色箭头运行
    
    

vue项目目录介绍

myfirstvue							// 项目名字
    node_modules					// 文件夹 内部有很多依赖的模块,打包时一定要删除
    public							// 存放公共文件的文件夹
        -favicon.ico				 // 网站小图标
        -index.html					 // spa: 单页面应用
    src								// 以后写代码 全在这个目录下面
    	assets						// 静态资源js、css、图片 类似于static文件夹
    		-logo.png				// 静态资源的图片
    	components					// 组件(小组件),用在大组件(页面组件)中
    		-HelloWorld.vue			 // 默认装有一个hello world组件
    	router						// 装了vue-router之后自动生成的,路由文件夹
    		-index.js				// vue-router的配置
    	store						// 装了vuex自动生成的
    		-index.js				// vuex的配置
    	views						// 里面放了一堆页面组件
    		-AboutView.vue			 // 自带的关于页面(页面组件)
    		-HomeView.vue			 // 自带的首页(页面组件)
    	-App.vue					 // 根组件
    	-main.js					// 整个项目的启动入口
    .gitignore						// git的忽略文件
    -babel.config.js				 // babel的配置
    -jsconfig.json					 // 
    -package.json					 // 重要 类似于python项目中的requements.txt 表示当前项目的依赖,node_modules文件夹删除之后就靠它来下载依赖
    -package-lock.json				  // 锁定文件:package.json中写了依赖的版本,这个文件锁定所有版本
    -README.md						  // 项目介绍
    -vue.config.js					  // vue项目下的配置文件

es6的导入导出语法

在导入之前必须要先导出
// 默认导入和导出:
	1.写一个js,在js中可以定义变量、函数、最后使用export default导出
        export default {
            name: '彭于晏',
            printName () {
                console.log(this.name)
            }
        }
	2.在想使用的js文件中,导入
		import 随便起个名字 from '路径'
// 命名导入和导出
	1.写一个js,在js中定义变量、函数、最后试用export导出
		export const name = 'lqz'
		export const printName = () => {
            console.log('xxx')
        }         
	2.在想使用的js中导入
    	import {printName} from './lqz/utils'

注意:在包下可以建立一个名为index.js的文件,以后导入的时候会默认找它
	对比python中的__init__.py

vue项目开发规范

以后写的组件全是单页面组件(xx.vue), 分为页面组件和小组件
每一个组件内部都有三部分:
	-<template></template>  # html内容写在里面
    -<script></script>      # 写js内容
    -<style></style>        # 写css样式
main.js是项目的入口
1App.vue根组件导入了,
2 使用new Vue({render: h => h(App)}).$mount('#app') 把App.vue组件中得数据和模板,插入到了index.html的id为app的div中了
3 以后,只要在每个组件的export default {} 写之前学过的所有js的东西
4 以后,只要在每个组件的template,写模板,插值语法,指令。。
5 以后,只要在每个组件的style,写样式

vue项目集成axios

1.安装axios
	-npm install axios --S
2.导入使用
	import axios from 'axios'
3.朝后端发送请求
	axios.get('http:127.0.0.1:8000/books/').then(res=>{
		this.bookList=res.data
	})
4.在django后端解决跨域问题
	1 pip3 install django-cors-headers
	2 app中注册:
        INSTALLED_APPS = (
            ...
            'corsheaders',
            ...
        )
    3 中间件注册
        MIDDLEWARE = [
        ...
        'corsheaders.middleware.CorsMiddleware',
        ...
        ]
    4 把下面的复制到配置文件中
        CORS_ORIGIN_ALLOW_ALL = True
        CORS_ALLOW_METHODS = (
            'DELETE',
            'GET',
            'OPTIONS',
            'PATCH',
            'POST',
            'PUT',
            'VIEW',
        )
        CORS_ALLOW_HEADERS = (
            'XMLHttpRequest',
            'X_FILENAME',
            'accept-encoding',
            'authorization',
            'content-type',
            'dnt',
            'origin',
            'user-agent',
            'x-csrftoken',
            'x-requested-with',
            'Pragma',
        )

props配置项

接受父传子自定义的属性

// 普通适用
	props: ['msg'],
// 属性验证
	props: {msg: String},
// 指定类型,必填和默认值
	props: {
        msg: {
          type: String, //类型
          required: true, //必要性
          default: '老王' //默认值
        }
      },

混入

mixin(混入) 可以把多个组件共用的配置提取成一个混入对象,把多个组件中公用的东西,抽取出来,以后可以全局使用和局部使用。

使用步骤:
1.写一个mixin/index.js
	export const hunhe = {
        data() {
            return {
              name: '彭于晏'
            }
      },
        methods: {
            handlePrintName() {
                alert(this.name)
            }
        },
    }
2.局部导入(在组件中)
	import {hunhe} from "@/mixin";
	mixins:[hunhe,]
3.全局使用(在main.js中,以后所有组件都可以用)
	import {hunhe} from "@/mixin";
	Vue.mixin(hunhe)

插件

功能:用于增强vue 本质:包含install方法的一个对象。 install方法的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据

使用步骤:
1. 写一个 plugins/index.js
	import Vue from "vue";
	import axios from "axios";
	import {hunhe} from '@/mixin'
	export default {
        install(miVue) {
            // console.log(miVue)
            // 1 vue 实例上放个变量
            // Vue.prototype.$name = 'lqz'  // 类比python,在类上放了一个属性,所有对象都能取到
            // Vue.prototype.$ajax = axios

            // 2 使用插件,加入混入
            // 全局使用混入
            // Vue.mixin(hunhe)


            // 3 定义全局组件
            // 4 定义自定义指令  v-lqz
            Vue.directive("fbind", {
                //指令与元素成功绑定时(一上来)
                bind(element, binding) {
                    element.value = binding.value;
                },
                //指令所在元素被插入页面时
                inserted(element, binding) {
                    element.focus();
                },
                //指令所在的模板被重新解析时
                update(element, binding) {
                    element.value = binding.value;
                },
            });

        }
    }
2. 在main.js中使用插件
import plugins from '@/plugins'
Vue.use(plugins)  // 使用use,会自动触发插件对象中得install
3. 以后在组件中可以直接用插件中写的样式

scoped样式

在style上写<style scoped>  </style>,以后只针对于当前组件生效

localStorage、sessionStorage和cookie

如果想在浏览器中存储数据
localStorage: 永久存储
sessionStorage: 关闭页面就没了(临时存储)
cookie: 设定一个时间,到时间就过期

 # 补充:序列化和反序列化
      // 对象转json字符串 
      // JSON.stringify(person)
      // json字符串转对象
      // JSON.parse()
<template>
  <div id="app">
    <h1>localStorage操作</h1>
    <button @click="saveStorage">点我向localStorage放数据</button>
    <button @click="getStorage">点我获取localStorage数据</button>
    <button @click="removeStorage">点我删除localStorage放数据</button>

    <h1>sessionStorage操作</h1>
    <button @click="saveSessionStorage">点我向sessionStorage放数据</button>
    <button @click="getSessionStorage">点我获取sessionStorage数据</button>
    <button @click="removeSessionStorage">点我删除sessionStorage放数据</button>

    <h1>cookie操作</h1>
    <button @click="saveCookie">点我向cookie放数据</button>
    <button @click="getCookie">点我获取cookie数据</button>
    <button @click="removeCookie">点我删除cookie放数据</button>
  </div>
</template>


<script>
import cookies from 'vue-cookies'

export default {
  name: 'App',
  data() {
    return {}
  },
  methods: {
    saveStorage() {
      var person = {
        name: '彭于晏',
        age: 38
      }
      localStorage.setItem('userinfo', JSON.stringify(person))
    },
    getStorage() {
      let userinfo = localStorage.getItem('userinfo')
      console.log(userinfo)
      console.log(typeof userinfo)
    },
    removeStorage() {
      // localStorage.clear()
      localStorage.removeItem('userinfo')
    },

    saveSessionStorage() {
      var person = {
        name: '彭于晏',
        age: 38
      }
      sessionStorage.setItem('userinfo', JSON.stringify(person))
    },
    getSessionStorage() {
      let userinfo = sessionStorage.getItem('userinfo')
      console.log(userinfo)
      console.log(typeof userinfo)
    },
    removeSessionStorage() {
      // localStorage.clear()
      sessionStorage.removeItem('userinfo')
    },

    saveCookie() {
      cookies.set('name','lqz','7d')  // 按秒计
    },
    getCookie() {
      console.log(cookies.get('name'))
    },
    removeCookie() {

      cookies.remove('name')
    }
  }


}
</script>

<style scoped>
h1 {
  background-color: aqua;
}
</style>

集成elementui

安装:npm i element-ui -S
在main.js中引入
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
1 使用elementui写登录 注册 显示所有图书

2 elementui做比较好的不布局
-----------
3 uni-app写个安卓app,打包好 
	-HBuilderX
    -远端打包