vue元件和路由的使用傳參
阿新 • • 發佈:2020-08-18
元件的使用傳參
1、在src目錄下建立一個components資料夾。 在其中建立一個 vue檔案。
2、註冊使用
註冊:
在script中import name from ''./路徑"
使用
<common-header> </common-header>
2、第二種方法:全域性引入使用(全域性註冊後,其他地方都可以直接使用元件)
1.main.js中註冊 import BsBtn from '@/components/BsBtn.vue'; //匯入 Vue.component('BsBtn',BsBtn) //註冊 2.使用 <template> <div> mv<bs-btn></bs-btn> //使用按鈕元件 </div> </template> <script> import BsBtn from '@/components/BsBtn.vue' export default{ name:"Music", components:{ //註冊 BsBtn } </script> //第二次使用則不需要寫匯入和註冊
3、元件中的傳參
- 父元素向子元素元件傳值。父元件傳遞給子元件時,使用自定義屬性傳參 。
1. 給子元件定義一個data屬性,接收父元件傳遞過來的引數//App.vue <MovieItem data="item" v-for="item of movies" :key="item.id"></MovieItem> 2.在子元件的props 屬性中接收 //item.vue <script> export default { name:"MovieItem" porps:{ data:{ type:Object } } } </script> 使用資料 //item.vue <template> <div> <img :src="data.images.small" alt=""> <p>{{data.title}}</p> </div> </template>
- 子元件向父元件傳值
//1.使用$emit方式自定義事件,向父元件傳參 <button @click="handleDelete(index)">刪除</button> <script> export default { ... methods:{ handleDelete(index){ this.$emit("deleteItem",index) } } }; </script> //2.父元件接收子元件傳遞過來的事件引數 <home-table :data="arr" @deleteItem="handleDelete"></home-table> <script> import HomeTable from './components/HomeTable' export default { name: 'app', ... methods:{ handleDelete(index){ console.log(index) //接收過來並列印。 } } } </script>
第二種元件:動態元件
動態元件 lishuge Vue //1.定義元件 //2.引入元件和data關聯 <template> <div> <button @click="handleToggle">toggle</button> //2.切換 元件 <component :is="isToggle?one:two"></component> //1.三元判斷顯示那個元件 </div> </template> <script> import One from "../components/One.vue"; import Two from '../components/Two.vue' export default { data() { --- return { | isToggle:false, | one: "One", | two:"Two" | }; | 關聯動態元件 }, | components: { | One, | Two | }, --- methods:{ handleToggle(){ this.isToggle = !this.isToggle } } }; </script
第三種方式:keep-alive(此元件具有路由功能)
keep-alive 包裹路由-元件。快取元件。之後元件不會被銷燬。元件對應的幾個生命週期函式不會重新觸發。
<keep-alive> <router-view /> </keep-alive> 3-1、當元件在<keep-alive>內被切換,他的activated和deactivated 這兩個生命週期鉤子函式將會 被對應執行 3-2、解決mounted生命週期不執行的問題 第一種:在路由新增屬性exclude="detail"(引號裡面是要執行週期的路由name) 1.exclude Tips:一定要給元件name屬性與其一致 export default { name: "Detail", data() { return { imgUrl: "" }; }, mounted() { ... } }; </script> 2.配置keep-alive //App.vue <keep-alive exclude="Detail"> <router-view /> </keep-alive> 第二種:在周期函式activated()請求資料 activated(){ var id=this.$route.params.id; var url="http://192.168.14.49:5000/playlist/detail?id="+id; this.axios.get(url).then(res=>{ console.log(res) console.log(res.data.playlist.coverImgUrl); this.imgUrl=res.data.playlist.coverImgUrl; }) } 注意: exclude Tips:一定要給元件name屬性與其一致
路由的使用以及傳參 跳轉
路由的配置詳解
例子:router-link 路由導航
router-view 主要是在構建單頁應用時,方便渲染指定路由對應的元件,渲染的元件是由vue-router指定的。
router-link 元件支援使用者在具有路由功能的應用中 (點選) 導航。 通過 to 屬性指定目標地址,預設渲染成帶有正確連結的<a>標籤,可以通過配置 tag 屬性生成別的標籤.。另外,當目標路由成功啟用時,連結元素自動設定一個表示啟用的 CSS 類名。
1.定義路由並掛載根例項
// 0. 如果使用模組化機制程式設計,匯入Vue和VueRouter,要呼叫 Vue.use(VueRouter)
// 1. 定義 (路由) 元件。
// 可以從其他檔案 import 進來
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }
// 2. 定義路由
// 每個路由應該對映一個元件。 其中"component" 可以是
// 通過 Vue.extend() 建立的元件構造器,
// 或者,只是一個元件配置物件。
// 我們晚點再討論巢狀路由。
const routes = [
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar }
]
// 3. 建立 router 例項,然後傳 `routes` 配置
// 你還可以傳別的配置引數, 不過先這麼簡單著吧。
const router = new VueRouter({
routes // (縮寫) 相當於 routes: routes
})
// 4. 建立和掛載根例項。
// 記得要通過 router 配置引數注入路由,
// 從而讓整個應用都有路由功能
const app = new Vue({
router
}).$mount('#app')
// 現在,應用已經啟動了!
--------------------------------------------------------------------------------
2.router-link和router-view
// router-link來導航,然後router-view顯示路由匹配到的元件。
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<div id="app">
<h1>Hello App!</h1>
<p>
<!-- 使用 router-link 元件來導航. -->
<!-- 通過傳入 `to` 屬性指定連結. -->
<!-- <router-link> 預設會被渲染成一個 `<a>` 標籤 -->
<router-link to="/foo">Go to Foo</router-link>
<router-link to="/bar">Go to Bar</router-link>
</p>
<!-- 路由出口 -->
<!-- 路由匹配到的元件將渲染在這裡 -->
<router-view></router-view>
</div>
--------------------------------------------------------------------------------
3.this.$router
通過注入路由器,我們可以在任何元件內通過 this.$router 訪問路由器,也可以通過 this.$route 訪問當前路由:
// Home.vue
export default {
computed: {
username() {
// 我們很快就會看到 `params` 是什麼
return this.$route.params.username
}
},
methods: {
goBack() {
window.history.length > 1 ? this.$router.go(-1) : this.$router.push('/')
}//goback 方法,當訪問的頁面大於1的時候 回退到上一個頁面,否則跳轉到/
}
}
該文件通篇都常使用 router 例項。留意一下 this.$router 和 router 使用起來完全一樣。我們使用 this.$router 的原因是我們並不想在每個獨立需要封裝路由的元件中都匯入路由。
1、路由的兩類寫法 常見的和動態路由
- 常見的路由以及子路由的配置
- 動態路由的配置
- 以及路由重定向
//常見的路由書寫
//第一步:引用vue和vue-router ,Vue.use(VueRouter) import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) //第二步:引用定義好的路由元件
import Films from '../views/Films.vue'
//第三步:定義路由(路由物件包含路由名、路徑、元件、引數、子路由等),每一個路由對映到一個元件
//第四步:通過new Router來建立router例項 export default new Router({ const routes = [
{
path: '/films',
name: 'films',
component: Films, //到此為止為第一種路由寫法
children:[
{
path:'nowPlaying',
component:()=>('../views/NowPlaying.vue')
},
{
path:'ComingSoon',
component:()=>('../views/ComingSoon.vue')
},
], //以上為子路由的寫法
}
{ //此往下為第二種路由的寫法 不用import引入元件
path:'./film',
name:'film',
component:()=>import('../views/Film.vue')
}, //以下是重定向
{
path:'/',
redirect:"films/nowPlaying"
}
]
//此往下第二類動態路由的寫法
{
path: '/test',
name: 'test', //命令路由
component: () => import('../views/test.vue'),
props:true //接收傳參
}
2、路由跳轉的傳參和接收引數
2-1. router-link
跳轉傳參:
<router-link :to="{name:'detail',query:{id:1213}}">detail</router-link> 接收: console.log(this.$route.query.id)
2-2. 動態路由中router-link
//配置動態路由 router/index.js { path: '/detail/:id', /* 命名路由 */ name: 'detail', component: () => import('../views/Detail.vue') props:true } 傳: <router-link :to="{name:'detail',params:{id:1213}}">detail</router-link> 接: mounted(){ console.log(this.$route.params.id) }
2-3. 事件跳轉傳參
一、在列表傳值this.$router.push()
<div @click="handleClick(data.id)"></div>
export default {
name:"Item",
props:{
data:{
type:Object,
required:true
}
},
methods:{
handleClick(id){
console.log(id)
this.$router.push(`/detail?id=${id}`)
}
}
};
二、在詳情頁接收傳值this.$route.query
export default {
name:"Detail",
computed:{
id(){
return this.$route.query.id
}
}
};
2-4. props解耦id對動態路由 和push()接收傳參有效
//配置路由 { path: '/detail/:id', /* 命名路由 */ name:'detail', component:() => import('../views/Detail.vue'), //core code props:true } //Detail.vue export default { props:['id'], mounted(){ console.log(this.id) } };