恐怖遊戲《寒冷之家》上架Steam 與朋友合作求生存
介紹
-
Vue (讀音 /vjuː/,類似於 view) 是一套用於構建使用者介面的漸進式框架。與其它大型框架不同的是,Vue 被設計為可以自底向上逐層應用。Vue 的核心庫只關注檢視層,不僅易於上手,還便於與第三方庫或既有專案整合。另一方面,當與現代化的工具鏈以及各種支援類庫結合使用時,Vue 也完全能夠為複雜的單頁應用提供驅動。
-
MVVM模式的實現者(Vue實現DOM監聽與資料繫結)
-
View是檢視層,也就是使用者介面。前端主要由HTML和CSS來構成,為了更方便地展現ViewModel或者Model層的資料。
-
Model是指資料模型,泛指後端進行的各種業務邏輯處理和資料操控,主要圍繞資料庫系統展開。這裡的難點主要在於需要和前端約定統一的介面規則。在Vue表示JavaScript物件
-
ViewModel由前端開發人員組織生成和維護的檢視資料層。在這一層,前端開發者從後端獲取得到Model資料進行轉換出來,做二次封裝,以生成符合View層使用預期的檢視資料模型。檢視狀態和行為都封裝在ViewModel裡。這樣的封裝使得ViewModel可以完整地去描述View層。
-
-
Vue七大屬性
-
el –element 選擇器:
通過el指定vm1所管理的view的位置,相當於一個容器,跟上面的div id = "app"做關聯,從此以後上面div id = "app"裡面的內容要通過vue來渲染,都要經過vue處理才能看得到上面div裡面的內容
-
data屬性:
用來組織從view中抽象出來的屬性,可以說將檢視的資料抽象出來存放在data中。
-
methods屬性:
放置頁面中的業務邏輯,js方法一般都放置在methods中,用來寫方法,函式的
-
template屬性
用來設定模板,會替換頁面元素,包括佔位符。
-
render屬性
建立真正的Virtual Dom
-
computed屬性
用來計算,根據已經存在的屬性計算出新的屬性,對於同樣的資料,會快取。當其依賴屬性的值發生變化是,這個屬性的值會自動更新,與之相關的DOM部份也會同步自動更新。其實一般情況,我也會把一些關於邏輯的程式碼都寫在computed中。
-
watch偵聽屬性
監聽data中資料的變化,兩個引數,一個返回新值,一個返回舊值 當你有一些資料需要隨著其它資料變動而變動時或者執行非同步操作或開銷較大操作時,建議使用watch
-
-
computed和watch是有區別的
-
watch: 監視,能夠監聽到資料的變化,只要資料變化的時候,都會自定執行對應的方法,其中可以檢測的資料來源分為三部分 data , computed , props computed: 計算屬性,存在一個計算快取的特性,每一次計算之後,只要裡面的邏輯不發生變化,每一次重複呼叫,都會使用上一次執行的結果,能夠節省計算的時間
-
入門案例
-
引入vue.js
- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
-
搭建helloword
-
<div id="app" >
{{message}}
</div>
<script src="https://lib.baomitu.com/vue/2.6.12/vue.min.js"></script>
<script>
var app=new Vue(
{ el:"#app",
data:{
message:"hello,vue"
}
}
)
</script>
-
vue指令
-
v-for 迴圈
-
v-if v-else 條件判斷 移除標籤
-
v-bind 繫結標籤屬性 比如動態繫結id值 v-bind:src="" => :src=""
-
v-on 事件處理,監聽dom事件 v-on:click="" =>@click=""
-
v-mode 表單輸入繫結
-
v-show 通過樣式的display控制標籤的顯示
computed 和 watch
-
初始化顯示/相關data改變執行
<div id="app">
<input type="text" v-model="xing">
<input type="text" v-model="ming">
<input type="text" v-model="name">
<input type="text " v-model="name2">
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
<script>
const vm = new Vue({
el: "#app",
data: {
xing: "niu",
ming:"mingyuan",
name2:""
},
computed:{
name(){
return this.xing+" "+this.ming; //方法返回值作為屬性!!!
}
},
//配置監視xing的變化
watch:{
xing:function(value){
this.name2=value+" "+this.ming;
}
}
});
vm.$watch('ming',function(value){
this.name2=this.xing+" "+value;
});
</script>
-
set/get
get() 回撥函式(你定義的,你沒有呼叫但執行了)計算並返回當前屬性的值
set(value) 回撥函式 當屬性值發生改變是回撥 更新相關的屬性資料
格式:
computed:{
name3:{
get(){
},
set(){
}
}
},
強制Class 和Style繫結
-
:class="變數名" 動態
-
:class=" '類名' " 靜態
-
:class="{類名:Boolean型別變數}" true 表示類名新增 false 表示類名移除
-
:style="key:value,color:color1" 屬性名:變數名
條件渲染
-
v-if / v-else 刪除dom元素
-
v-show 改變style的display的屬性
列表渲染
遍歷陣列
<div id="for">
<ul >
<li v-for="(person,index) in persons" :key="index" >
{{index}}------{{person.name}}---{{person.age}}------
<button @click="del(index)">刪除</button>
<button @click="upd(index)">更新</button>
</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
<script>
var vm2 = new Vue({
el: "#for",
data: {
persons: [
{name:"niuniu",age:18},
{name:"huahua",age:16},
{name:"lala",age:19}
]
},
methods: {
del(index){
this.persons.splice(index,1);
},
upd(index){
// this.persons[index]={name:"aaaaa",age:18};
this.persons.splice(index,1,{name:"aaaaa",age:18})
}
},
});
</script>
-
vue 本身只監視屬性的改變,沒有監視內部變化
// this.persons[index]={name:"aaaaa",age:18}; 這個方法 改變了 persons指向的陣列的內部資料 但實際上persons指向的地址是不發生變化的因此他不會更新介面
-
this.persons.splice(index,1) 這個更新了介面是因為 vue對陣列的方法進行了重寫
重寫方法的內部包括:原方法的內容+更新介面方法 因此呼叫了這些方法 介面資料會改變
遍歷物件(很少使用瞭解)
v-for="(item,key) in persons[1]" item 屬性值 key屬性名
搜尋過濾
<div id="for">
<input type="text" v-model="searchname">
<ul >
<li v-for="(person,index) in newpersons" :key="index" >
{{index}}------{{person.name}}---{{person.age}}------
</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
<script>
var vm2 = new Vue({
el: "#for",
data: {
searchname:"",
persons: [
{name:"niuniu",age:18},
{name:"huahua",age:16},
{name:"lala",age:19}
]
},
computed:{
newpersons(){
//filter 監聽一個數組返回一個滿足條件的新陣列
//indexOf返回引數中字串在原字串的下標 如果沒有找到 返回值為-1
return this.persons.filter(item=>item.name.indexOf(this.searchname)!==-1);
}
}
});
</script>
排序
-
<div id="for">
<ul>
<li v-for="(person,index) in newpersons" :key="index">
{{index}}------{{person.name}}---{{person.age}}------
</li>
</ul>
<button @click="setSortflag(1)">升序</button>
<button @click="setSortflag(2)">降序</button>
<button @click="setSortflag(0)">正常</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
<script>
var vm2 = new Vue({
el: "#for",
data: {
sortflag: 0, //0正常 1升序 2降序
persons: [{
name: "niuniu",
age: 18
},
{
name: "huahua",
age: 32
},
{
name: "lala",
age: 19
}
]
},
methods: {
setSortflag(flag) {
this.sortflag = flag;
}
},
computed: {
newpersons() {
let newperson= this.persons.filter(item=>item.name.indexOf("")!==-1); //每次要更新檢視 如果直接賦值是不會更新檢視的
let sortflag =this.sortflag;
if (sortflag!== 0) {
newperson.sort( //返回複數p1在前返回正數p2在前
function(p1,p2){
if (sortflag === 1){
return p1.age-p2.age
}else{
return p2.age-p1.age
}
}
)
}
return newperson;
}
}
})
</script>
事件處理
-
繫結事件
-
停止事件冒泡
-
組織事件預設行為
-
按鍵修飾符
<div id="for">
<!-- 繫結監聽 -->
<button @click="test1">事件繫結</button>
<button @click="test2(1)">傳遞引數</button>
<button @click="test3">無參傳遞事件</button>
<button @click="test4(123,$event)">帶參傳遞事件</button><br>
<div style="width: 200px; height: 160px; " @click="wout">
<!-- @click.stop 停止事件冒泡 -->
<div style="width: 100px; height: 80px; " @click.stop="win">
</div>
</div>
<!-- 組織事件預設行為 -->
<a href="http:www.baidu.com" @click.prevent="">去百度</a>
<!-- 按鍵修飾符 @keyup.名稱/keycode-->
<input type="text" name="" id="" @keyup.Enter="testkey">
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
<script>
var vm2 = new Vue({
el: "#for",
methods: {
test1:function(){
alert("事件繫結")
},
test2:function(num){
alert("傳遞引數"+num)
},
test3:function(event){
alert("無參傳遞事件"+event.target.innerHTML)
},
test4:function(num,event){
alert("帶參傳遞事件"+num+'------'+event.target.innerHTML)
},
wout:function(){
alert("點選了外部")
},
win:function(){
alert("點選了內部")
},
testkey:function(){
alert("按下enter");
}
},
});
</script>
表單輸入繫結
-
@submit
-
@submit.stop 停止事件冒泡
-
@submit.prevent 阻止預設行為
-
<div id="demo">
<form action="" @submit.prevent="login">
賬號:<input type="text" name="username" v-model="username"> <br>
密碼: <input type="text" name="password" v-model="password"> <br>
性別: <input type="radio" name="sex" value="男" v-model="sex">男
<input type="radio" name="sex" value="女" v-model="sex" >女 <br>
愛好:<input type="checkbox" value="藍球" name="blueball" v-model="likes">藍球
<input type="checkbox" value="紅球" name="redball"v-model="likes" >紅球
<br>
語言: <select name="yuyan" id="" v-model="yyitem">
<option value="">未選擇</option>
<option v-for="yy in yys" :value="yy" >{{yy}}</option>
</select><br>
<input type="submit">
</form>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
<script>
const vm= new Vue({
el:"#demo",
data: {
username:"",
password:"",
sex:"男",
likes:[],
yys:["java","python","c++"],
yyitem:"python"
},
methods: {
login:function(){
console.log(this.username+"---"+this.password+"----"+this.sex+"----"+this.likes+"---"+this.yyitem);
}
},
})
</script>
生命週期
-
初始化鉤子函式 mounted 初始化顯示後立即被呼叫
-
銷燬前執行 beforeDestory
-
過濾器
<div id="demo">
<p>顯示格式化 過濾器</p>
<!-- 繫結過濾器 -->
<p>性別:{{sex | realsex}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
<script>
//value 為繫結該過濾器的值 即sex
Vue.filter("realsex",function(value){
return value===1?'男':'女'
})
const vm=new Vue({
el:"#demo",
data:{
sex:1
}
})
</script>
自定義指令
<div id="demo">
<p>自定義指令</p>
<p v-big-text="msg"></p>
{{msg}}
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
<script type="text/javascript">
Vue.directive('big-text',function(el,binding){
console.log(el,binding)
//el 就是標籤
//binding 內容
// def: {bind: ƒ, update: ƒ}
// expression: "msg"
// modifiers: {}
// name: "big-text"
// rawName: "v-big-text"
// value: "AbcDefG"
// __proto__: Object
//轉大寫
el.textContent=binding.value.toUpperCase();
})
const vm=new Vue({
el:"#demo",
data:{
msg:"AbcDefG"
},
})
</script>
區域性指令
const vm=new Vue({
el:"#demo",
data:{
msg:"AbcDefG"
},
directives:{
lower:function(el,binding){
console.log(binding);
el.textContent=binding.value.toLowerCase();
}
}
})
vue元件
自定義標籤
<body>
<div id="app">
<niuniu v-for="item in items" v-bind:a="item"></niuniu>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
//元件
Vue.component("niuniu",{
props:['a'],
template:'<li>{{a}}</li>'
});
var demo1=new Vue({
el:"#app",
data:{
items:[1,2,3,4]
},
methods:{
}
})
</script>
</body>
網路通訊
axios
<body>
<div id="app">
<div>名字:{{msg.name}}</div>
<div>年齡:{{msg.age}}</div>
<div>主頁:{{msg.url}}</div>
<a v-bind:href="msg.url">主頁</a>
女朋友:<ul>
<li v-for="item in msg.girlfriends">
{{item}}
</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
var demo1=new Vue({
el:"#app",
data(){
return{
msg:{
name:null,
age:null,
url:null,
girlfirends:[
]
}
}
},
mounted(){
axios.get("data.json").then((response)=>(this.msg=response.data))
}
})
</script>
</body>
解決網速慢導致先載入模板再出資料
<div id="app" v-cloak>
<style>
[v-cloak]{
display: block;
}
</style>
Vue-router路由
安裝 cnpm install vue-router --save-dev
配置router
-
<router-view></router-view> 顯示路由跳轉的檢視
-
<router-link to=""></router-link> 相當於a標籤
-
this.$router.push("/content")
this.$router.push({name:'xxx',params:{xx:xx}})
js裡 路由跳轉函式
巢狀路由
實現檢視區域性改變
點選導航 內容部分改變 頭部和導航欄不發生變化
routes:[
{
path:'/content',
name:'Content',
component:Content,
children:[
{
path:'/member',
name:'shopitem',
component:member
},
{
path:'/shopitem',
name:'shopitem',
component:shopitem
}
]
}
]
引數傳遞
-
路徑匹配
-
方式一
路由: path:'/shopitem/:id' id即為引數
link: to="/shopitem/1"
這樣 1 就賦給了 id
{{$route.params.id}}
這樣就獲取到了引數id -
方式二
路由: path:'/shopitem/:id' id即為引數
link: :to="{name:xxx,params:{id=1}}" name 為路由的名字
這樣 1 就賦給了 id
{{$route.params.id}}
這樣就獲取到了引數id
-
-
props
-
啟用props傳參方式
{
path:'/shopitem/:id',
name:'shopitem',
component:shopitem,
props:ture 啟用props傳參
} -
傳參
路由: path:'/shopitem/:id' id即為引數
link: :to="{name:xxx,params:{id=1}}" name 為路由的名字
這樣 1 就賦給了 id -
獲取引數
<template>
<div>
{{id}}
</div>
</template>
<script>
export default {
name:"shopitem",
props:['id']
}
</script>
-
重定向(傳參方式與上面一致)
{
path:'/goshopitem',
redirect:'/goshopitem'
}
路由模式與hash模式
-
預設為hash模式 位址列會顯示#
-
路由模式 不帶#
export default new VueRouter({
mode:'history', 在路由配置加入這行
404處理
在router配置檔案中加入以下程式碼
{
path:'*',
component:notfound
}
路由鉤子+axios
-
路由鉤子函式
-
beforeRouterEnter 進入路由前執行
-
beforeRouterLeave 進入路由後執行
-
-
axios (類似ajax)
-
安裝 cnpm install axios -s
-
main.js 匯入使用
import axios from 'axios'
Vue.prototype.axios=axios; -
export default {
name:"member",
//導航
beforeRouteEnter (to, from, next) {
//to 到達的元件
// from 從哪個元件來
next(vm=>{
this.memberlist();
})
},
methods: {
memberlist:function(){
this.axios({method:'get',url:'xxxxx'}).then((response) => {
console.log(response.data)
})
}
},
}
-
vue-x
-
安裝 cnpm install vuex --save
-
main.js裡面 匯入使用
初始化一個vue專案
-
npm install -g @vue/cli-init
# `vue init` 的執行效果將會跟 `[email protected]` 相同
vue init webpack my-project
int a; -
cnpm install vue-router --save-dev
-
進入專案目錄 執行 cnpm install 匯入依賴