vue框架:
路飞项目1.vue框架" title="vue框架">vue框架:
前台html+css+js框架,是不同于js与jq的数据框架
指令| 实例成员| vue项目
2.drf框架:
django的插件,完成前后台分离项目后台接口编写的框架
序列化组件| 三大认证组件|
分页,筛选,过滤,排序|请求,解析,响应
3.路飞项目:
前台vue完成,后台由drf框架完成前后台分离项目
git| 短信认证| celery异步任务| 项目上线
-----------------------------------------------------------------------------------
js对象(字典)补充:
let b = 20;
let dic = {
a:10, //字典本身就是对象,key都是字符串形式可以省略引号
b(b:b) // 值为变量时,且与key同名,可以简写
};
console.log(dic)
vue:
1.what是:用于构建用户界面的渐进式JavaScript框架(选择性控制)
2.why.学:
1.是三大主流框架之一: Angular React Vue
2.有先进的前端设计模式: MVVM
3.可以完全脱离服务器端,以前端代码复用的方式渲染整个页面,组件化开发
4.结合了其他框架的优点,轻量级,中文API,数据驱动,双向绑定,单页面应用
5.虚拟DOM ***
缺点:没其他两个框架完善,在趋于完善中
3.vue环境: 本地导入,cdn导入
注: 渐进式框架:根据需求,可以决定vue框架控制项目的具体方位,可以为一个标签,也可以为一个页面,甚至可以为一个项目
new Vue({el:'.xxx'})
4.挂载点:
1.html页面:html与body不能作为挂载点,css3选择器语法
2.一个vue对象挂载点之后只索引一个匹配结果,所以通常用id标识
实例成员:
1.实例成员,data为vue环境提供数据,数据采用字典{}形式;
2.fiters: 过滤器函数fn(a,b)-----> {{a | fn(b)}} | {{a,b | fn}}
3.method:事件方法
------------------------------------
computed: 设置 方法属性,该方法属性在页面渲染后,绑定的方法中任意变量发生改变(都被监听),都会回调绑定的方法,
eg: 一个变量依赖多个变量
watch: 设置已有属性的监听事件,监听的变量改变就会回调绑定的方法啊
eg:多个变量依赖一个变量
props:声明组件的自定义属性
emit: 为组建自定义事件发送数据
指令:
文本: {{}} | v-text | v-html
事件: v-on:click="clickAction" | @click="clickAction" | @click="clickAction($event)"
属性: v-bind:stylt="myStyle" | :class="[c1,c2]" | :class="{active: isActive}"
表单指令: v-model="变量"
-----------------------------
v-once:
v-cloak: 防止页面加载 抖动
v-show: 绑定的页面为布尔类型,隐藏时,在页面中以 display:none 渲染
v-if|v-else-if|v-else: 前分支成立会屏蔽后分支,else分支不需要条件
v-for: 遍历
字符串: v-for="(ch,index) in str"
数组: v-for="(ele,index) in arr"
对象: v-for="(value,key,index) in obj"
组件:
1.定义:一个包含html,css,js独立的集合体,可以完成页面解析的代码复用
2.组件分为根组件,全局组件,局部组件
根组件:
全局组件:
vue.component("组件名",{实例成员萌})
局部组件:必须在使用该组件的父组件中注册
let 组件名 = {实例抽根烟}
3.组件都有自己template(根组件可以省略采用挂在点),
子组件可以复用,所以数据要做局部化处理data(){ return{} }:
在哪个组件模板中出现的变量,就由当前组件提供变量对应 的值
4.组件信息交互
父传子:提供绑定自定义属性
子传父:提供自定义事件携带
Vue 项目搭建:
1.安装 node
官网下载安装包,傻瓜式安装:https://nodejs.org/zh-cn/
2.换源安装cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
3.安装脚手架
cnpm install -g @vue/cli
4.如果2或3安装出错 清除缓存处理
npm cache clean --force
Vue 项目创建:
vue create 项目名;
在pycharm中配置npm项目
项目目录
main.js:程序的入口文件
加载vue环境
加载插件环境: 路由,仓库,ajax,cookie,element-ui...
加载自定义环境:全局样式(global.css),全局配置(settings.js)
渲染根组件
.vue文件形式组件
template标签:内部有且只有一个跟标签
script标签: export default{},导出该局部内容
style标签: scope属性,实现样式的组件化
项目运行生命周期:
main.js => router.js => 链接 => 页面组件 =>替换根组件中的router-view
标签完成页面渲染 => 通过 router-link | this.$router.push()切换路由
(链接) => 完成渲染组件的替换 => 页面的跳转
新建页面的三步骤:
1.创建页面组件
2.设置组件路由
3.设置路由跳转
组件的生命周期钩子:组件从生成到销毁整个过程的一些特殊时间节点回调的函数
this.$router:路由跳转
this.$route:路由数据(this.$route.path)
vue-router插件:****
路由跳转:
this.$router.push('/course');
this.$router.puth({name:course});
this.$router.go(-1);
this.$router.go(1);
<router-link :to="/course">课程页</router-link>
<router-link :to='{name:'course'}">课程页</router-link>
路由传参
第一种:
配置:path:'/path/:pk' =>请求: '/path/${pk} =>取值:this.$route.params.pk
第二种:
配置:path:'/path',name='path' =>请求:{name:'path',query={pk:值}} =>取值 this.$route.query.pk
完成跨组件传参的方式:
1. localStarage: 永久存储数据
2. sessionStorage: 临时存储数据(刷新页面数据不重置)
3. cookie: 临时或永久数据(由过期时间决定)
4. vuex的仓库(store.js): 临时存储数据(刷新页面数据重置)
vuex仓库插件***
store.js配置文件
export default new Vuex.Store({
state: {
title: '默认值'
},
mutations: {
// mutations 为 state 中的属性提供setter方法
// setter方法名随意,但是参数列表固定两个:state, newValue
setTitle(state, newValue) {
state.title = newValue;
}
},
actions: {}
})
在任意组件中给仓库变量赋值
this.$store.state.title = 'newTitle'
this.$store.commit('setTitle','newTitle')
在任意组件中取仓库变量的值
console.log(this.$store.state.title)
vue-cookie插件:***
安装:
>:cnpm install vue-cookies
main.js配置:
第一种:
import cookies from 'vue-cookies' // 导入插件
Vue.use(cookies); // 加载插件
new Vue({
// ...
cookies, // 配置使用插件原型 $cookies
}).$mount('#app');
第二种*****
import cookies from 'vue-cookies' // 导入插件
Vue.prototype.$cookies = cookies; // 直接配置插件原型 $cookies
使用:
增(改): key,value,exp(过期时间)
时间: 1s | 1m | 1h | 1y
this.$cookies.set('token',token,'1y');
查:key
this.$cookies.get('token');
删: key
this.$cookies.remove('token')
注: cookie一般是用来存储token的
1.token: 安全认证的随机字符串
2.有后台产生,存储于后台的(session表中,文件,内存缓存),存储于前台的(cookie中)
3.服务器先生成反馈给前台(登录认证过程),
前台提交给后台完成认证(需要登录后的请求)
4.前后台分离项目:后台生成token,返回给前台 ==>前台自己存储,
发送携带token请求 ==> 后台完成token校验 ==>后台得到登录用户
axios插件:****
安装:
cnmp install axios
main.js配置:
import axios from 'axios' //导入插件
Vue.prototype.$axios = axios; 直接配置插件原型
使用:
this.axios({
url:'请求接口',
method:'get|post',
data:{post提交的数据},
params:{get提交的数据},
header:{请求头}
}).then(function(response){
请求成功的回调函数}).catch(function(error){
请求失败的回调函数})
案例:
// get请求
this.$axios({
url: 'http://127.0.0.1:8000/test/ajax/',
method: 'get',
params: {
username: this.username
}
}).then(function (response) {
console.log(response)
}).catch(function (error) {
console.log(error)
});
// post请求
this.$axios({
url: 'http://127.0.0.1:8000/test/ajax/',
method: 'post',
data: {
username: this.username
}
}).then(function (response) {
console.log(response)
}).catch(function (error) {
console.log(error)
});
跨越问题(同源策略):
后台接收到前台的请求,可以接收前台数据与请求信息,发现请求的信息不是自身服务器发来的请求,拒绝响应数据,这种情况称之为 - 跨域问题(同源策略 CORS)
导致跨域情况有三种
1) 端口不一致
2) IP不一致
3) 协议不一致
Django如何解决 - django-cors-headers模块
1) 安装:pip3 install django-cors-headers
2) 注册:
INSTALLED_APPS = [
...
'corsheaders'
]
3) 设置中间件:
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware'
]
4) 设置跨域:
CORS_ORIGIN_ALLOW_ALL = True
element-ui插件:
下载=>配置=>使用
下载:
cnpm install element-ui
配置main.js:
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
使用:
依照官网 https://element.eleme.cn/#/zh-CN/component/installation api
View Code
组件间的交互
父传子:<head>
<meta charset="UTF-8">
<title></title>
<style>
.info {
text-align: center;
width: 200px;
padding: 3px;
box-shadow: 0 3px 5px 0 pink;
float: left;
margin: 5px;
}
.info img {
width: 200px;
}
</style>
</head>
<body>
<div id="app">
<info v-for="info in infos" :key="info.image" :myinfo="info"></info>
</div>
</body>
<script src="js/vue.js"></script>
<script>
// 伪代码:模拟数据从后台请求
/*
let infos = '';
document.onload = function () {
$.ajax({
url: '/images/',
type: 'get',
success (response) {
infos = response.data
}
})
};
*/
let infos = [
{
image: 'img/001.png',
title: '小猫'
},
{
image: 'img/002.png',
title: '蛋糕'
},
{
image: 'img/003.png',
title: '蓝糕'
},
{
image: 'img/004.png',
title: '恶犬'
},
];
let info = {
template: `
<div class="info">
<img :src="myinfo.image" alt="">
<p><b>{{ myinfo.title }}</b></p>
</div>
`,
props: ['myinfo']
};
// 数据交互 - 父传子 - 通过绑定属性的方式
// 1) 父组件提供数据
// 2) 在父组件模板中,为子组件标签设置自定义属性,绑定的值有父组件提供
// 3) 在子组件实例中,通过props实例成员获得自定义属性
new Vue({
el: '#app',
components: {
info,
},
data: {
infos,
}
})
</script>
子传父:<head>
<meta charset="UTF-8">
<title></title>
<style>
.close:hover {
cursor: wait;
color: red;
}
</style>
</head>
<body>
<div id="app">
<p>
<input type="text" v-model="userMsg">
<button @click="sendMsg">留言</button>
</p>
<ul>
<msg-li @remove_msg="removeAction" v-for="(msg, i) in msgs" :msg="msg" :index="i" :key="msg"></msg-li>
</ul>
</div>
</body>
<script src="js/vue.js"></script>
<script>
let msgLi = {
template: `
<li>
<span class="close" @click="deleteMsg(index)">x </span>
<span>第{{ index + 1 }}条:</span>
<span>{{ msg }}</span>
</li>
`,
props: ['msg', 'index'],
methods: {
// 系统的click事件
deleteMsg(i) {
// $emit('自定义事件名', 参数们)
this.$emit('remove_msg', i);
this.$emit('myclick', 1, 2, 3, 4, 5)
}
}
};
// 组件交互-子传父
// 1) 数据由子组件提供
// 2) 子组件内部通过触发系统事件,发送一个自定义事件,将数据携带出来
// 3) 父组件位子组件标签的自定义属性通过方法实现,就可以通过参数拿到子组件传递处理的参数
new Vue({
el: '#app',
data: {
msgs: [],
userMsg: ''
},
methods: {
sendMsg() {
if (this.userMsg) {
this.msgs.push(this.userMsg);
this.userMsg = "";
}
},
removeAction(i) {
this.msgs.splice(i, 1)
}
},
components: {
msgLi
}
})
</script>
以上是 vue框架: 的全部内容, 来源链接: utcz.com/z/376805.html