Vue框架 03
Vue项目开发:
前后端完全分离
后端:提供接口数据
前端:页面转跳、页面布局、页面数据渲染全部由前端做
中间交互:请求
搭建Vue项目环境:
Vue项目需要自建服务器:node
node介绍:
1.用C++语言编写,用来运行JavaScript语言
2.node可以为前端项目提供server (包含了socket)
node下载安装:https://nodejs.org/zh-cn/
一路点击下一步就可以。
npm:包管理器 - 为node拓展功能的
# 换国内源,加速下载,通过命令行换源:
# 管理员命令行:npm install -g cnpm --registry=https://registry.npm.taobao.org
# MacOS: sudo npm install -g cnpm --registry=https://registry.npm.taobao.org
# 索引npm的指令都可以换成cnpm
# npm install vuex => cnpm install vuex
vue cli环境:脚手架 - 命令行快速创建项目
# cnpm install -g @vue/cli
# 如果报错:npm cache clean --force
创建Vue项目
起步
1.cd 到目标目录
2.创建项目:vue create 目录名
创建项目的过程
提示下载原:选择淘宝镜像
具体配置:上下键切换,空格键选择,回车键进入下一步
1.第二个选项进入自定义配置
2.Babel jsES6语法转换ES5,Router路由 Vuex组件数据交互 Formatter格式化代码
3...有提示选择大写,没提示默认第一个即可
选y
开始下载:
启动项目
两种启动方式:
①终端启动
1.进入项目:cd到项目目录
2.启动项目:npm run serve
②pycharm配置启动
1.安装vue.js插件,重启
2.配置项目的npm启动项
3.启动node搭建的socket
如果项目环境搭建失败,可以将搭建成功的项目中的相关文件及文件夹:
然后打开管理员打开cmd命令
cd e:\vue-proj进入项目文件目录下
cnpm install 对自己电脑的当前环境进行重新安装依赖,重构项目环境,这样就可以用了,使用pycharm打开该文件夹就行了
该方法可以用于快速创建和搭建项目环境使用,这样就不用每次vue create进行下一步下一步了
项目目录
打开main.js
修改后按ctrl+s保存后页面会实时刷新,且文件后缀都可以省略不写
页面组件开发
组件创建:
创建新组件之后的基本页面情况:
<template>
<!-- 只能有一个根标签 -->
</template> <script>
export default {
name: "Main",
data: function() {
return { }
},
...
}
</script> <style scoped>
/* scoped 可以让样式实现局部化*/
/* 如果让样式实现全局化,则应该写在根组件样式中*/
</style>
组件渲染
<!-- Main.vue 主页组件 -->
<template>
<div class="main">
<h1>{{ title }}</h1>
</div>
</template> <script>
export default {
name: "Main",
data:function () {
return {
title:'主页'
}
}
}
</script> <style scoped>
.main {
height: 100vh;
background-color: beige;
}
h1 {
margin: 0;
color: darkred;
}
</style>
<!-- App.vue根组件 -->
<template>
<div id="app">
<Main></Main> </div>
</template> <script>
import Main from '@/views/Main'
export default {
components:{
Main:Main
}
}
</script> <style>
html, body {
margin: 0;
}
</style>
说明:
路由:router.js
在根组件中设计转跳页面的导航栏
<template>
<div id="app">
<ul class="nav">
<li>主页</li>
<li>商品页</li>
<li>个人页</li>
</ul>
</div>
</template> <script>
import Main from '@/views/Main'
export default {
components:{
Main:Main
}
}
</script> <style>
.nav {
height: 60px;
background-color: silver;
}
.nav li {
float: left;
height: 60px;
width: 123px;
text-align: center;
line-height: 60px;
}
.nav li:hover {
background-color: aquamarine;
} html, body, ul {
margin: 0;
}
ul {
list-style: none;
}
</style>
创建三个页面组件
<!--Main.vue-->
<template>
<div class="main">
<h1>{{ title }}</h1>
</div>
</template> <script>
export default {
name: "Main",
data:function () {
return {
title:'主页'
}
}
}
</script>
<style scoped>
.main {
height: 100vh;
background-color: beige;
}
h1 {
margin: 0;
color: darkred;
}
</style>
<!--Goods.vue-->
<template>
<div class="goods">
<h1>商品页</h1>
</div>
</template> <script>
export default {
name: "Goods"
}
</script> <style scoped> </style>
<!--User.vue-->
<template>
<div class="user">
<h1>个人页</h1>
</div>
</template> <script>
export default {
name: "User"
}
</script> <style scoped> </style>
配置路由(router.js中)
import Vue from 'vue'
import Router from 'vue-router'
import Main from '@/views/Main.vue'
import Goods from '@/views/Goods.vue'
import User from '@/views/User.vue' Vue.use(Router) export default new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{
path: '/',
name: 'main',
component: Main
},
{
path: '/goods',
name: 'goods',
component: Goods
},
{
path: '/user',
name: 'user',
component: User
},
//第二种方式
// {
// path: '/about',
// name: 'about',
// // route level code-splitting
// // this generates a separate chunk (about.[hash].js) for this route
// // which is lazy-loaded when the route is visited.
// component: () => import(/* webpackChunkName: "about" */ './views/About.vue')
// }
]
})
根组件中:
<template>
<div id="app">
<ul class="nav">
<li>
<router-link to="/">主页</router-link>
</li>
<li>
<router-link to="/goods">商品页</router-link>
</li>
<li>
<router-link to="/user">个人页</router-link>
</li>
</ul>
<!--<router-view></router-view>-->
<router-view/>
</div>
</template> <script>
import Main from '@/views/Main'
export default {
components:{
Main:Main
}
}
</script> <style>
.nav {
height: 60px;
background-color: silver;
}
.nav li {
float: left;
height: 60px;
width: 123px;
text-align: center;
line-height: 60px;
}
.nav li:hover {
background-color: aquamarine;
} html, body, ul, h1 {
margin: 0;
}
ul {
list-style: none;
}
a {
text-decoration: none;
font: bold 20px/60px 'STSong';
}
</style>
前后台交互
axios
// 安装 axios(ajax)的命令
// npm install axios --save
// 为项目配置全局axios(main.js中)
import Axios from 'axios'
Vue.prototype.$ajax = Axios
goods组件中设置ajax给后台发送数据(在组件渲染完毕时候发送)
<!--Goods.vue-->
<template>
<div class="goods">
<h1>商品页</h1>
</div>
</template>
<script>
export default {
name: "Goods",
beforeCreate() {
window.console.log("开始创建Goods组件");
},
created() {
window.console.log("创建Goods组件完毕");
},
mounted() {
window.console.log("Goods组件渲染完毕");
// 请求后台
this.$ajax({
method:'post',
url:'http://127.0.0.1:8000/goods/',
params:{
info:'前台数据'
} }).then(function (res) {
window.console.log(res)
})
}
} </script>
<style scoped> </style>
新建一个Django项目,作为后台接收、返回数据
settings.py中手动将csrf中间件注释掉(这里需要注意真正项目中前后端分离时,Django的csrf中间件时通过代码层面禁用并手写安全认证,这里注释掉主要方便我们测试)
路由配置:
from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^goods/', views.goods),
]
视图函数
def goods(request):
print(request.method)
print(request.POST)
print(request.GET) return HttpResponse('后台数据')
发现跨域问题:后台能收到前台发送的请求数据,但是由于跨域问题,只要前台端给后端发送数据,后端都会接收,来者不拒,但是由于跨域问题,导致Django不认识它,所以
不给它返回数据。
## Django跨域问题 #### 什么是跨域 ```python
'''
通常情况下,A网页访问B服务器资源时,不满足以下三个条件其一就是跨域访问
1. 协议不同
2. 端口不同
3. 主机不同
'''
``` #### Django解决跨域 ```python
'''
安装django-cors-headers模块 在settings.py中配置
# 注册app
INSTALLED_APPS = [
...
'corsheaders'
]
# 添加中间件
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware'
]
# 允许跨域源
CORS_ORIGIN_ALLOW_ALL = True
'''
```
解决跨域:
①在pycharm中安装django-cors-headers
②在Django配置文件中:
然后前端进行处理数据:
这样渲染msg后发现报错:
发现msg没有被定义,但是在data中明明已经定义了msg,所以错误不在data中,最后发现在then的回调函数中的this
问题解析:
① 在this.ajax上先声明个变量_this=this将vue实例存起来,然后在then的回调函数中打印this和_this
从以上结果来看,在生命周期钩子函数下的this指向的是当前创建的vue实例,而在这些函数内部使用例如axios与后台交互后回调函数的内部的this并非指向当前的vue实例;
箭头函数相当于匿名函数,并且简化了函数定义。看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,由上下文确定。此时this在箭头函数中已经按照词法作用域绑定了。很明显,使用箭头函数之后,箭头函数指向的函数内部的this已经绑定了外部的vue实例了.
vue-cookie
// 安装cookie的命令
// npm install vue-cookie --save
// 为项目配置全局vue-cookie(在main.js中)
import VueCookie from 'vue-cookie'
// 将插件设置给Vue原型,作为全局的属性,在任何地方都可以通过this.$cookie进行访问
Vue.prototype.$cookie = VueCookie
// 持久化存储val的值到cookie中
this.$cookie.set('val', this.val)
// 获取cookie中val字段值
this.$cookie.get('val')
Vue框架 03的更多相关文章
- Vue 框架-08-基础实战 demo
Vue 框架-08-基础实战 demo 前面介绍了有 7 篇了,都是小实例,没有相对完整的应用,虽然有些功能挺实用,但还是有的不常用的,今天记录一篇关于前几篇基础内容的实战 demo,也是对 Vue ...
- Vue框架Element的事件传递broadcast和dispatch方法分析
前言 最近在学习饿了么的Vue前端框架Element,发现其源码中大量使用了$broadcast和$dispatch方法,而Element使用的是Vue2.0版本,众所周知在Vue 1.0升级到2.0 ...
- 使用vue框架运行npm run dev 时报错解决
使用使用vue框架运行npm run dev 时报错 如下: 原因: localhost:8080 有可能其他软件占用了,导致其他问题的出现 我们可以动态修改地址 解决: 进入项目文件的config文 ...
- Vue框架下的node.js安装教程
Vue框架下的node.js安装教程 python服务器.php ->aphche.java ->tomcat. iis -->它是一个可以运行JAVASCRIPTR 的运行环 ...
- Vue框架axios请求(类似于ajax请求)
Vue框架axios get请求(类似于ajax请求) 首先介绍下,这个axios请求最明显的地方,通过这个请求进行提交的时候页面不会刷新 <!DOCTYPE html> <html ...
- Vue框架之双向绑定事件
Vue框架之双向绑定事件 首先介绍下Vue框架的语法 vue通过 {{temp}} 来渲染变量 {{count+100}} # 求和 v-text # 为标签插入text文本 v-html # 为标签 ...
- Vue框架
Vue框架 环境: windows python3.6.2 Vue的cdn: <script src="https://cdn.jsdelivr.net/npm/vue"&g ...
- vue框架入门和ES6介绍
vue框架入门和ES6介绍 vue-mvvm模式,vue是一种轻量级的前端框架,主要为模板渲染,数据同步,组件化,模块化,路由等. https://cn.vuejs.org/ 源码:https://g ...
- 基于VUE框架 与 其他框架间的基本对比
基于VUE框架的基本描述 与 其他框架间的基本对比 2018-11-03 11:01:14 A B React React 和 Vue 有许多相似之处,它们都有: 使用 Virtual DOM 提供 ...
随机推荐
- 洛谷 P2341 [HAOI2006]受欢迎的牛 题解
今天学了强连通分量的Tarjan算法,做了这道类似于板子题的题(尽管我调了1.5h).主要的思路是用Tarjan缩点之后,求每个点的入度(实际上是出度,因为我是反着连边的).如果 有且只有一个点的入度 ...
- swiper轮播图插件
一.简介 ①Swiper是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端.Swiper能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果. ②Swiper 是一款免费以及 ...
- DACL原理.控制文件的访问权限(文件,注册表.目录.等任何带有安全属性的对象.)
目录 一丶简介 1.DACL是什么. 2.如何创建一个自己控制的文件. 3.SDDL是个什么鬼. 二丶 编写SDDL 控制的文件 一丶简介 1.DACL是什么. DACL称为自主访问的控制列表.是应用 ...
- 关于移动虚拟机后,linux网卡启动异常问题解决
废话不多说,直接上解决办法. 首先执行命令:ifconfig -a 会发现原来是eth0, 而现在变成了eth1了 然后我们编辑规则配置信息: vim /etc/udev/rule.d/70-pers ...
- Shiro安全框架案例
基于Shiro的用户认证(不包含授权) Spring整合Shiro shiro原理 1.1 搭建环境 1.1.1 web模块 pom.xml <dependency> < ...
- ICEM-三角形特征几何
原视频下载地址:https://pan.baidu.com/s/1qY8SKri 密码: wf17
- 刷题记录:Shrine
目录 刷题记录:Shrine 刷题记录:Shrine 题目复现链接:https://buuoj.cn/challenges 参考链接:Shrine 解此题总结一下flask的SSTI:CTF SSTI ...
- 第06组 Alpha冲刺(4/4)
队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11913386.html 作业博客 :https://edu.cnblogs.com/campus/f ...
- 第2课第5节_Java面向对象编程_异常_P【学习笔记】
摘要:韦东山android视频学习笔记 java的异常处理的原则如下: 1.我们先写一个没有对异常处理的程序,在进行除法运算的时候,除数是非零的话,运行时没有问题的,但是除数为零的时候,运行就会有问 ...
- 搭建阿里云服务 FTP 折中方案
该配置的服务都配置了,端口也都打开了 ,但是ftp 就是连接不上 就是打不开目录 8uftp 出现以下情况 配置文件逐条检查,端口逐个检查 都没有问题,还是出现这种情况,实在没辙,蛋疼...... ...