歡迎關注個人公衆號 css
學習的內容以下html
開始前端
父組件向子組件傳遞值vue
父組件,能夠在引用子組件的時候,經過屬性綁定(v-bind:)的 形式,把須要傳遞給子組件的數據,以屬性綁定的形式,傳遞到子組件的內部 <com1 v-bind:parentmsg="msg"></com1>
vue-router
子組件不能訪問到 父組件data中的數據,就是訪問不到msg,可是有方法能夠訪問到bootstrap
子組件中的data的數據,並非經過父組件傳遞的,是本身私有的,後端
子組件經過Ajax請求回來的數據數組
data裏面的數據是可讀可寫的bash
把父組件傳遞過來的屬性parentmsg,定義一下,這樣才能使用父組件中的數據服務器
template:"<h1 @click='change'>子組件 ---{{parentmsg}}--</h1>",
複製代碼
props:["parentmsg"],
複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/vue.min.js"></script>
</head>
<body>
<div id="app">
<!-- 父組件,能夠在引用子組件的時候,經過屬性綁定(v-bind:)的
形式,把須要傳遞給子組件的數據,以屬性綁定的形式,傳遞到子組件的內部 -->
<com1 v-bind:parentmsg="msg"></com1>
</div>
<script>
//能夠把vm當成一個組件
var vm=new Vue({
el:"#app",
data() {
return {
msg:"父組件---我是vue的數據"
}
},
methods: {
},
components:{
//子組件不能訪問到 父組件data中的數據,就是訪問不到msg,可是有方法能夠訪問到
com1:{
//子組件中的data的數據,並非經過父組件傳遞的,是本身私有的,
// 子組件經過Ajax請求回來的數據
// data裏面的數據是可讀可寫的
data() {
return {
title:"dd"
}
},
template:"<h1 @click='change'>子組件 ---{{parentmsg}}--</h1>",
// 把父組件傳遞過來的屬性parentmsg,定義一下,這樣才能使用父組件中的數據
// props裏面的數據是隻讀的,不可以更改的,可是好像如今能夠了??
props:["parentmsg"],
methods: {
change(){
this.parentmsg="修改了 props裏面的數據是隻讀的,不可以更改的,可是好像如今能夠了??"
}
},
}
}
})
</script>
</body>
</html>
複製代碼
子組件向父組件傳遞值
子組件傳遞給父組件值,其實就是父組件傳遞一個方法,子組件調用方法,而後把值傳遞給父組件
事件綁定機制,v-on 把父組件的show的方法傳遞給子組件的event
v-on
能夠簡寫爲 @
符號
<com2 v-on:event="show"></com2>
複製代碼
template: "#tmpl",
複製代碼
// 如何拿到父組件的方法
//emit 願意就是觸發,調用
this.$emit("event", this.ddddd)
this.$emit("event", "我是子組件傳遞過來的值哦")
this.$emit("event", 123456)
複製代碼
setTimeout(function () {
console.log('執行了');
console.log(shimingForSon)
}, 3000);
複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/vue.min.js"></script>
</head>
<!-- -->
<!-- 子組件傳遞給父組件值,其實就是父組件傳遞一個方法,子組件調用方法,而後把值傳遞給父組件 -->
<body>
<div id="app">
<!-- 事件綁定機制,v-on 把父組件的show的方法傳遞給子組件的event-->
<!-- v-on 能夠簡寫爲 @符號 -->
<com2 v-on:event="show"></com2>
</div>
<template id="tmpl">
<div>
<h2>我是tmpl組件</h2>
<input type="button" value="點我,能夠觸發父組件的方法" @click="myDemo">
</div>
</template>
<script>
//定義了一個字面量類型的組件模板對象
var com2 = {
// 經過制定了一個ID,去加載id的template元素中的內容,當作組件的HTML結構
template: "#tmpl",
data() {
return {
// 對象
ddddd: { name: "仕明同窗", age: "18" }
}
},
methods: {
myDemo() {
console.log("我是子組件")
// 如何拿到父組件的方法
//emit 願意就是觸發,調用
this.$emit("event", this.ddddd)
this.$emit("event", "我是子組件傳遞過來的值哦")
this.$emit("event", 123456)
}
},
}
//能夠把vm當成一個組件
var vm = new Vue({
el: "#app",
data() {
console.log("data我開始執行了")
return {
msg: "父組件---我是vue的數據",
shimingForSon: null
}
},
methods: {
// 這個data可讓子組件傳遞參數過來
show(data) {
console.log("我是父組件的方法show" + data)
console.log(data)
this.shimingForSon = data
// 為什麼打印不出來這個對象????? 我已經延遲3s了啊啊啊啊啊
setTimeout(function () {
console.log('執行了');
console.log(shimingForSon)
}, 3000);
// console.log(shimingForSon)
}
},
components: {
com2
}
})
</script>
</body>
</html>
複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/vue.min.js"></script>
<!-- 注意是rel 啊 -->
<link rel="stylesheet" href="./lib/bootstrap.min.css">
</head>
<body>
<div id="app">
<!-- loaddata的方法是父組件的傳遞給子組件 -->
<box @func="loadData"></box>
<ul class="list-group">
<li class="list-group-item" v-for="item in list" :key="item.id">
<span class="badge">{{item.user}}</span>
{{item.content}}
</li>
</ul>
</div>
<template id="tmpl">
<div>
<div class="form-group">
<label>人:</label>
<textarea class="form-control" v-model="user"></textarea>
</div>
<div class="form-group">
<label>內容:</label>
<textarea class="form-control" v-model="content"></textarea>
</div>
<div class="form-group">
<input type="button" value="發表" @click="add" class="btn btn-primary">
</div>
</div>
</template>
<script>
var commentBox = {
template: "#tmpl",
data() {
return {
user: "",
content: "",
}
},
methods: {
add() {
console.log("點擊組件的")
// 數據存放到了 localStorage中去了
// 組織一個最新的評論數據對選哪一個
// 把對象存儲到localStorage中去
// 注意 localStorage中支持存放字符串數據,先調用 JSON.stringify
// 注意 數據完整性,新加的數據要和舊的數據一塊兒存儲
// 注意 若是數據不存在的話,就直接返回一個空的數組
// 注意單詞千萬不要寫錯了啊
var commentqq = {
id: Date.now(), user: this.user, content: this.content
}
// 從本地獲取數據
var strdata = localStorage.getItem("cmts") || "[]"
var list = JSON.parse(strdata)
// 注意順序
// list.push(commentqq)
// 就是把數據添加到首部
list.unshift(commentqq)
// 保存數據到本地
localStorage.setItem("cmts", JSON.stringify(list))
// 清空數據
this.user = this.content = ""
console.log("點擊組件的 end" + list + this.user)
// 點擊完了 我須要刷新數據
// func 是父組件傳遞過來的方法 子組件來觸發這個方法
this.$emit("func")
}
},
}
var vm = new Vue({
el: "#app",
data: {
list: [
{ id: Date.now(), user: "shiming", content: "text" },
{ id: Date.now(), user: "shiming1", content: "text1" },
{ id: Date.now(), user: "shiming2", content: "text2" }
]
},
methods: {
loadData() {
var strdata = localStorage.getItem("cmts") || "[]"
var list = JSON.parse(strdata)
this.list = list
}
},
//初始化好了
created() {
this.loadData()
},
components: {
"box": commentBox
}
})
</script>
</body>
</html>
複製代碼
ref
獲取DOM元素和組件的引用console.log(this.$refs.id_h3.innerText)
<div id="app">
<input type="button" value="獲取元素" @click="getElement" ref="btn">
<!-- ref 能夠指定 原生的DOM對象 -->
<h3 id="id_h3" ref="id_h3">你好啊</h3>
</div>
複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/vue.min.js"></script>
</head>
<body>
<div id="app">
<input type="button" value="獲取元素" @click="getElement" ref="btn">
<!-- ref 能夠指定 原生的DOM對象 -->
<h3 id="id_h3" ref="id_h3">你好啊</h3>
<hr>
<!-- 組件也可使用 -->
<login ref="myLogin"></login>
</div>
<template id="login">
<h1>登錄</h1>
</template>
<script>
var login = {
template: "#login",
data() {
return {
msg:"我是組件"
}
},
methods: {
show(){
console.log("調用了子組件的方法")
}
},
}
var vm = new Vue({
el: "#app",
data: {
},
methods: {
getElement() {
// 經過id獲取DOM元素 ,可是Vue不推薦
// <h3 id="id_h3">你好啊</h3>
console.log(document.getElementById("id_h3"))
console.log("我是Vue中獲取DOM元素的對象的方法")
// 輸出你好 我擦 牛逼
// ref 是 reference
console.log(this.$refs.id_h3.innerText)
// 獲取子組件中的 data
console.log(this.$refs.myLogin.msg)
// 調用子組件的方法
this.$refs.myLogin.show()
}
},
components:{
"login":login
}
})
</script>
</body>
</html>
複製代碼
URL
的hash (#)
號來實現不一樣頁面之間的切換,同時hash
有一個特色,http
的請求不會包含ash
相關的內容,因此單頁面的程序主要是經過hash
實現<!-- vue -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<!-- vue路由 -->
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
複製代碼
var login = {
template: "<h1>我是登錄組件</h1>"
}
var register = {
template: "<h1>我是註冊組件</h1>"
}
複製代碼
const router = new VueRouter({
// 表示路由匹配的規則
routes: [
// path 表示監聽那個路由鏈接的地址
// component 百世路由前面匹配到的path,展現相對的應的那個組件
// component 必須是一個組件的模板對象,不能是組件應用的名稱
// 指定默認的爲登錄,可是不推薦啊
// {path:"/",component:login},
// redirect進入頁面的時候,直接就去login組件的頁面
{ path: "/", redirect: "/login" },
{ path: "/login", component: login },
{ path: "/register", component: register }
],
// 默認值: "router-link-active"
// 設置 連接激活時使用的 CSS 類名。默認值能夠經過路由的構造選項 linkActiveClass 來全局配置。
// 改爲本身的想要的樣式
linkActiveClass:"myStyle"
})
複製代碼
// 將路由規則對象,註冊到vm實例上,用來監聽URL對象的地址的變化。而後展現相對應的組件
router: router
複製代碼
注意事項
redirect進入頁面的時候,直接就去login組件的頁面 { path: "/", redirect: "/login" },
"router-link-active" 設置 連接激活時使用的CSS
類名。默認值能夠經過路由的構造選項linkActiveClass
來全局配置。 改爲本身的想要的樣式 linkActiveClass:"myStyle"
path
表示監聽那個路由鏈接的地址
component
必須是一個組件的模板對象,不能是組件應用的名稱
路由傳遞參數方式一
使用k to="/login?id=10&name=shiming"
傳遞參數,
<!-- router-link 默認渲染爲a標籤 tag指定渲染成什麼標籤-->
<!-- 若是在路由中,使用查詢字符串,給路由傳遞參數,則不須要修改路由規則的path屬性 -->
<router-link to="/login?id=10&name=shiming" tag="span">登錄</router-link>
複製代碼
created
方法中獲取參數// 組件的生命週期
created() {
console.log("我是登錄組件的日誌")
console.log(this.$route)
console.log(this.$route.query.id)
},
複製代碼
// 經過這種的方式能夠拿到路徑中的值
var login = {
template: "<h1>我是登錄組件 {{$route.query.id }}----{{$route.query.name}}</h1>",
// 組件的生命週期
created() {
console.log("我是登錄組件的日誌")
console.log(this.$route)
console.log(this.$route.query.id)
},
}
複製代碼
router-link-active
其中的值的意思:/* 實現路由的文字的顏色 */
.router-link-active {
color: red;
font-weight: 800;
/* 傾斜 */
font-style: italic;
/* 大小 */
font-size: 100px;
/* 下劃線 */
text-decoration: underline;
/* 背景色 */
background-color: goldenrod
}
複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<!-- vue -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<!-- vue路由 -->
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<style>
/* 實現路由的文字的顏色 */
.router-link-active {
color: red;
font-weight: 800;
/* 傾斜 */
font-style: italic;
/* 大小 */
font-size: 100px;
/* 下劃線 */
text-decoration: underline;
/* 背景色 */
background-color: goldenrod
}
.myStyle {
color: hotpink;
}
.v-enter,
.v-leaver-to {
opacity: 0;
transform: translateX(100px);
}
.v-enter-active,
.v-leaver-active {
transition: all 0.5s ease;
}
</style>
</head>
<body>
<div id="app">
<!--不推薦這樣使用 -->
<!-- <a href="#/login">登錄</a>
<a href="#/register">註冊</a> -->
<!-- router-link 默認渲染爲a標籤 tag指定渲染成什麼標籤-->
<!-- 若是在路由中,使用查詢字符串,給路由傳遞參數,則不須要修改路由規則的path屬性 -->
<router-link to="/login?id=10&name=shiming" tag="span">登錄</router-link>
<router-link to="/register">註冊</router-link>
<!-- 這是 vue-router中提供的元素,專門用來站位使用 -->
<!-- 包裹動畫 mode="out-in"動畫的加載的方式-->
<transition mode="out-in">
<router-view></router-view>
</transition>
</div>
<script>
// 經過這種的方式能夠拿到路徑中的值
var login = {
template: "<h1>我是登錄組件 {{$route.query.id }}----{{$route.query.name}}</h1>",
// 組件的生命週期
created() {
console.log("我是登錄組件的日誌")
console.log(this.$route)
console.log(this.$route.query.id)
},
}
var register = {
template: "<h1>我是註冊組件</h1>"
}
const router = new VueRouter({
// 表示路由匹配的規則
routes: [
// path 表示監聽那個路由鏈接的地址
// component 百世路由前面匹配到的path,展現相對的應的那個組件
// component 必須是一個組件的模板對象,不能是組件應用的名稱
// 指定默認的爲登錄,可是不推薦啊
// {path:"/",component:login},
// redirect進入頁面的時候,直接就去login組件的頁面
{ path: "/", redirect: "/login" },
{ path: "/login", component: login },
{ path: "/register", component: register }
],
// 默認值: "router-link-active"
// 設置 連接激活時使用的 CSS 類名。默認值能夠經過路由的構造選項 linkActiveClass 來全局配置。
// 改爲本身的想要的樣式
linkActiveClass: "myStyle"
})
var vm = new Vue({
el: "#app",
data: {
},
methods: {
},
// 將路由規則對象,註冊到vm實例上,用來監聽URL對象的地址的變化。而後展現相對應的組件
// 若是屬性名同樣的話,能夠直接寫 router
// router: router
router
})
</script>
</body>
</html>
複製代碼
<!-- router-link 默認渲染爲a標籤 tag指定渲染成什麼標籤-->
<router-link to="/login/10/lishiming" tag="span">登錄</router-link>
複製代碼
{ path: "/login/:id/:name", component: login },
const router = new VueRouter({
// 表示路由匹配的規則
routes: [
// path 表示監聽那個路由鏈接的地址
// component 百世路由前面匹配到的path,展現相對的應的那個組件
// component 必須是一個組件的模板對象,不能是組件應用的名稱
// 指定默認的爲登錄,可是不推薦啊
// {path:"/",component:login},
// redirect進入頁面的時候,直接就去login組件的頁面
{ path: "/", redirect: "/login" },
// 第二種傳遞參數的方法
{ path: "/login/:id/:name", component: login },
{ path: "/register", component: register }
],
// 默認值: "router-link-active"
// 設置 連接激活時使用的 CSS 類名。默認值能夠經過路由的構造選項 linkActiveClass 來全局配置。
// 改爲本身的想要的樣式
linkActiveClass: "myStyle"
})
複製代碼
router
若是屬性名同樣的話,能夠直接寫// 將路由規則對象,註冊到vm實例上,用來監聽URL對象的地址的變化。而後展現相對應的組件
// 若是屬性名同樣的話,能夠直接寫 router
// router: router
router
複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<!-- vue -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<!-- vue路由 -->
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<style>
/* 實現路由的文字的顏色 */
.router-link-active {
color: red;
font-weight: 800;
/* 傾斜 */
font-style: italic;
/* 大小 */
font-size: 100px;
/* 下劃線 */
text-decoration: underline;
/* 背景色 */
background-color: goldenrod
}
.myStyle {
color: hotpink;
}
.v-enter,
.v-leaver-to {
opacity: 0;
transform: translateX(100px);
}
.v-enter-active,
.v-leaver-active {
transition: all 0.5s ease;
}
</style>
</head>
<body>
<div id="app">
<!--不推薦這樣使用 -->
<!-- <a href="#/login">登錄</a>
<a href="#/register">註冊</a> -->
<!-- router-link 默認渲染爲a標籤 tag指定渲染成什麼標籤-->
<router-link to="/login/10/lishiming" tag="span">登錄</router-link>
<router-link to="/register">註冊</router-link>
<!-- 這是 vue-router中提供的元素,專門用來站位使用 -->
<!-- 包裹動畫 mode="out-in"動畫的加載的方式-->
<transition mode="out-in">
<router-view></router-view>
</transition>
</div>
<script>
// 經過這種的方式能夠拿到路徑中的值
var login = {
template: "<h1>我是登錄組件 {{$route.params.id}}----{{$route.params.name}}</h1>",
// 組件的生命週期
created() {
console.log("我是登錄組件的日誌")
console.log(this.$route.params.id)
},
}
var register = {
template: "<h1>我是註冊組件</h1>"
}
const router = new VueRouter({
// 表示路由匹配的規則
routes: [
// path 表示監聽那個路由鏈接的地址
// component 百世路由前面匹配到的path,展現相對的應的那個組件
// component 必須是一個組件的模板對象,不能是組件應用的名稱
// 指定默認的爲登錄,可是不推薦啊
// {path:"/",component:login},
// redirect進入頁面的時候,直接就去login組件的頁面
{ path: "/", redirect: "/login" },
// 第二種傳遞參數的方法
{ path: "/login/:id/:name", component: login },
{ path: "/register", component: register }
],
// 默認值: "router-link-active"
// 設置 連接激活時使用的 CSS 類名。默認值能夠經過路由的構造選項 linkActiveClass 來全局配置。
// 改爲本身的想要的樣式
linkActiveClass: "myStyle"
})
var vm = new Vue({
el: "#app",
data: {
},
methods: {
},
// 將路由規則對象,註冊到vm實例上,用來監聽URL對象的地址的變化。而後展現相對應的組件
// 若是屬性名同樣的話,能夠直接寫 router
// router: router
router
})
</script>
</body>
</html>
複製代碼
children
的屬性 實現路由的嵌套children
屬性,實現子路由,同時,子路由的path
前面不要帶 /
,若是帶了,就永遠以根路徑開始請求,這樣不方便咱們用戶去理解URL
地址<router-view></router-view>
若是使用須要了使用就必須使用佔位符<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<!-- vue -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<!-- vue路由 -->
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<!-- 這種方式也是能夠引用組件的哦 -->
<!-- <shiming></shiming> -->
<router-link to="/acount">Acount</router-link>
<router-view></router-view>
</div>
<template id="tmpl">
<div>
<h1>這是 Account組件 裏面還嵌套了一個路由</h1>
<!-- 路由的嵌套 -->
<router-link to="/acount/login"> 登錄</router-link>
<router-link to="/acount/register">註冊</router-link>
<!-- 佔位符 必需要 -->
<router-view></router-view>
</div>
</template>
<script>
var account = {
template: "#tmpl"
}
var login = {
template: "<h3>登錄</h3>"
}
var register = {
template: "<h3>組成</h3>"
}
const router = new VueRouter({
// 這裏的不能寫成 routers 哦
routes: [
{
path: "/acount",
component: account,
// 使用children的屬性 實現路由的嵌套
// 記住 ,login前面不能加上 /
// 雖然還有另外的方式,可是呢?建議這樣使用,而後方便去理解
// 使用children屬性,實現子路由,同時,子路由的paht前面不要帶 / ,若是帶了,就永遠以根路徑開始請求,這樣不方便咱們用戶去理解URL地址
children: [
{ path: "login", component: login },
{ path: "register", component: register }
]
},
// //
// { path: "/acount/login", component: login },
// { path: "/acount/register", component: register }
]
})
var vm = new Vue({
el: "#app",
data: {
},
methods: {
},
components: {
"shiming": account
},
router
})
</script>
</body>
</html>
複製代碼
components
對應不少的組件<router-view></router-view>
三個坑<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<!-- vue -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<!-- vue路由 -->
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<style>
/* 設置html頁面中的 body邊距 */
html,body{
margin: 0;
padding: 0;
}
.container {
display: flex;
}
/* h1 標籤沒有逗號哦 記住哦 */
h1{
margin: 0;
padding: 0;
font-size: 20px;
}
.header {
background-color: aqua;
height: 100px;
}
.left {
background-color: yellow;
flex: 2;
height: 600px;
}
.main {
background-color: blueviolet;
flex: 10;
height: 600px;
}
</style>
</head>
<body>
<div id="app">
<!-- 3個坑 -->
<router-view></router-view>
<div class="container">
<router-view name="left"></router-view>
<router-view name="main"></router-view>
</div>
</div>
<script>
var header = {
template: "<h1 class='header'>Header 頭部</h1>"
}
var leftBox = {
template: "<h1 class='left'>left 側邊欄</h1>"
}
var mainBox = {
template: "<h1 class='main'>mainBox 主體區域</h1>"
}
const router = new VueRouter({
routes: [
// 這種方法不能實現
// {path:"/",component:header},
// {path:"/left",component:left},
// {path:"/mainBox",component:mainBox},
// components 對應不少的組件
{
path: "/", components: {
"default": header,
"left": leftBox,
"main": mainBox
}
}
]
})
var vm = new Vue({
el: "#app",
data: {
},
methods: {
},
// router名字同樣 能夠簡寫哦
router
})
</script>
</body>
</html>
複製代碼