Vue-CLI 项目搭建

# 页面中写--》不好---》工程化---》vue是一个前端项目---》webpack支持---》vue官方提供了一个工具
# vue-cli:vue的脚手架,快速创建一个vue项目,带了很多文件
# 解释:
	vue2 中,都是使用vue-cli
  vue3中,可以使用vue-cli创建,官方更推荐使用 vite ,更块,更小
  

  
# Vue-CLI 是基于nodejs的
	-nodejs:是一门后端编程语言
  -js:前端运行在浏览器中,浏览器中有js的解释器,但是这个解释器只能运行在浏览器中,不能运行在操作系统之上
  -于是就有人,把v8引擎,让它能够运行在操作系统之上+c语言写的:文件,网络,操作系统操作的代码
  -nodejs:js语法,运行在操作系统上,后端语言
  -跟python一样,是一个解释型语言---》解释器
  
  
  -LTS:长期支持版本,https://nodejs.org/en/download/
  
# 搭建node环境
  -下载相应平台的版本
  	-一路下一步,安装即可,自动加入环境变量(在任意位置都可以执行这俩命令)
    -装完后会释放两个可执行文件
    	node:  等同于 python
      npm:   等同于 pip
      
      
      
# 安装 vue-cli:脚手架
# pip install django ---》去国外下载很慢,npm也是很慢,加速
# 【可以不用】以后使用淘宝定制的cnpm替代npm,去淘宝镜像站下载,速度块
# 执行:
npm install -g cnpm --registry=https://registry.npm.taobao.org
# 这句话执行完了,以后,就有俩可以安装第三方模块的命令  npm:慢    cnpm:块
# 以后装任何第三方模块,建议使用cnpm,但是使用npm一样的,只是速度差距
cnpm install -g @vue/cli



# 使用vue脚手架,创建vue项目,装完脚手架,就会有个  vue  命令
vue create 项目名  # 注意路径

# 使用编辑器打开创建好的项目(pycharm)

# 另一种创建项目的方式
vue ui

vue项目目录文件介绍

myfirstvue  # 项目名,文件夹
  -node_modules # 当前vue项目所有的以来   python虚拟环境一样的,很大,小文件很多,可以删除
  -public      # 文件夹
    favicon.ico # 页面小图片
    index.html  # 单页面开发,就这一个index.html
  src        # 文件夹,核心代码都在这,以后,都在这里面写东西
    assets   # 静态资源:js,css,图片。。。
    components # 小组件
    router    # 装vue-router就会有它,不装就没有
    store     # 装了vuex就会有它,不装就没有
    views     # 组件,页面组件
    App.vue   # 跟组件
  main.js     # 非常重要,整个项目的入口,等同于django的managepy
  .gitignore  # git忽略文件
  babel.config.js # 语法检查,不用管
  jsconfig.json  
  package.json    # 很重要,等同于 Python项目   requirements.txt 放了项目所有的以来,不能删
  package-lock.json # 锁定依赖包,
  README.md     # 介绍
  vue.config.js # vue配置文件

es6导入导出语法

# 写vue项目,大量的看到:他们是es6的导入和导出语法
		import App from './App.vue'
		export default{}
    
# 总结:
	1 以后可以在任意位置写xx.js,可以定义变量,定义函数
  2 导出某些变量,函数
   export default {
     name,print
   }
    
   2.1 默认导出和命名导出
  #默认导出   不用名名字
	export default {}
	# 命名导出
  export const a =10
    
  3 在想用的地方导入
  	import 别名  form '路径'  # . 和 ..
  4 使用
    别名.name
    别名.print()
    
    

    
 # 补充:如果一个包下有一个名为index.js 的文件,可以只导入到包这一层
import lqz from './lqz' #  简写成,index.js 可以省略,以后看到的index.js 等同于python的包中的__init__.py
lqz.showName()

vue项目开发技巧

# 以后组件化开发,就是写一个个的组件:页面组件,小组件

# App.vue :根组件

# 以后就是写组件,组件就是  xx.vue
## 第一部分
<template>
  <div id="app">  # 组件必须套在一个标签内部,之前咱们用反引号写的html内容
  </div>
</template>

## 第二部分:
<script>
export default {
  # 以后在这个对象中写咱们之前学的data,methods,watch,computed,生命周期钩子
  name: 'App',
  data() {
    return {
      name: 'lqz'
    }
  },
  methods: {
    handleClick() {
      this.name = '彭于晏'
    }

  }
}
</script>

## 第三部分:这里面写样式
<style>
h1 {
  background-color: red;
}
</style>




# 使用步骤

##1  以后,只要创建组件  HelloWorld.vue
<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    x的值是:{{x}},y的值是:{{y}}
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: ['msg'],  # 父传子,自定义属性,接受
  data(){
    return {
      x:10,
      y:20
    }
  }
}
</script>

## 2 在根组件App.vue 中使用这个组件
<template>
  <div id="app">
    <h1>我是h1</h1>
    {{ name }}
    <br>
    <button @click="handleClick">点我名字变化</button>
    <hr>
    <HelloWorld :msg="msg"></HelloWorld>  # 自定义属性实现父传子
  </div>
</template>

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

<script>
// 把HelloWorld组件导入
import HelloWorld from "@/components/HelloWorld.vue";
export default {
  name: 'App',
  data() {
    return {
      name: 'lqz',
      msg:'你好啊'
    }
  },
  methods: {
    handleClick() {
      this.name = '彭于晏'
    }

  },
  components:{ # 注册局部组件
    HelloWorld
  }
}
</script>

axios与后端交互处理跨域,携带数据,携带请求头

1 .使用axios与后端交互

# 1 安装
npm install -S axios
# 2 在想用的地方导入使用即可
import axios from 'axios'
# 3 使用发送请求即可
  axios.get('http://127.0.0.1:8000/user/').then(res=>{
        console.log(res)
        this.name=res.data.name
        this.age=res.data.age
      })


# 解决跨域很多种:浏览器的同源策略
	-1 后端使用cors技术
  -2 使用nginx转发
  -3 前端做代理:之上测试阶段使用,上线后没有

2 处理跨域

# 1  django中使用django-cors-headers,解决跨域
# 2 安装 pip3 install django-cors-headers
# 3 在app的注册中加入
INSTALLED_APPS = (
	...
	'corsheaders',
	...
)
# 4 在中间件中加入
MIDDLEWARE = [ 
	...
	'corsheaders.middleware.CorsMiddleware',
	...
]

# 5 配置文件中加入
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
	'*'
)
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',
)

3 post请求携带数据

handleSubmit() {
      axios.post('http://127.0.0.1:8000/user/', {
        username: this.username,
        password: this.password
      }).then(res => {
        console.log(res.data)
        if (res.data.code == 100) {
          // 登录成功跳转到百度
          location.href = 'http://www.baidu.com'
        } else {
          alert(res.data.msg)
        }
      })
    }

4 携带请求头

# 请求头中带token

handleSubmit1() {
      axios.post('http://127.0.0.1:8000/user/',
          {
            username: this.username,
            password: this.password
          },
          {
            headers: {token: 'asdfasdfasd'}
          }
      ).then(res => {
        console.log(res.data)
        if (res.data.code == 100) {
          // 登录成功跳转到百度
          location.href = 'http://www.baidu.com'
        } else {
          alert(res.data.msg)
        }
      })
    }

props配置项指定默认值

# props是组件间通信,父传子,自定义属性时,子组件间中接收父组件中传入的数据使用的配置项
# 三种使用方式
 //1 基本使用
  // props: ['msg'],
  // 2 属性认证,限制类型
  // props:{
  //   msg:String  // 接受的msg必须是string类型
  // },
  // 3 限定类型,限定必传,限定默认值
  props: {
    msg: {
      type: String, //类型
      required: false, //必要性
      default: '老王' //默认值
    },
    xx:Boolean,
  },

混入

# minxin 混入:可以把多个组件共用的配置提取成一个混入对象

# 提取混入对象
1 第一步:抽取共用的代码,定义混入  mixin的index.js下写了
export const hunhe = {
    methods: {
        handleShowName() {
            alert(this.name)
        }
    },
}

2 第二步:注册混入,全局注册(只要注册了,所有组件都可以用)
// 全局注册混入,以后所有组件中都能用
import {hunhe} from '@/mixin'
Vue.mixin(hunhe)

3 第三步:注册混入,局部注册,在组件中注册了,这个组件可以用(在组件中)
import {hunhe} from "@/mixin";
mixins: [hunhe]

插件

# 插件功能:用于增强Vue,后期咱们学的vuex,vue-router,elementui都是基于插件的形式使用的

# 实现一个插件
1 定义一个插件,插件内部加入混入
import Vue from 'vue'
export default {
    install(a) {
        console.log(a)
        // 写代码,加入混入
        Vue.mixin({
            methods: {
                handleShowName() {
                    alert(this.name)
                }
            }
        })
    

    }
}


2 应用插件  在main.js中
import plugins from './plugins'
Vue.use(plugins) // 自动调用插件内的install,完成对Vue的强化

命名插槽的其他写法

# 1 默认插槽
# 2 具名插槽
# 3 使用v-slot:bottom指定命名插槽  建议使用这个
  <template v-slot:bottom>
        <form action="" >
          <p>用户名:<input type="text"></p>
          <p>密码:<input type="password"></p>
          <button>登录</button>
        </form>
        <p>我是p标签</p>
  </template>