├── README.md ├── docs ├── babel │ └── index.babel ├── css │ └── style.css ├── index.html ├── js │ ├── index.js │ ├── named.vue │ ├── sidebar.vue │ ├── user-list.vue │ └── user.vue └── scss │ └── style.scss └── license.txt /README.md: -------------------------------------------------------------------------------- 1 | # vue-without-webpack -------------------------------------------------------------------------------- /docs/babel/index.babel: -------------------------------------------------------------------------------- 1 | const User = { 2 | props: { 3 | userId: { 4 | type: Number, 5 | required: true 6 | }, 7 | userData: { 8 | type: Object, 9 | required: false // User can accept a userData object on params, or not. It's totally optional. 10 | } 11 | }, 12 | template: ` 13 |
14 |

User ({{userId}})

15 |
16 |

This route makes use of some option data that was passed in:

17 |

{{userData.name}}({{userData.age}} yrs old)

18 |
19 |
20 | `, 21 | methods: { 22 | } 23 | } 24 | 25 | const UserList = { 26 | data() { 27 | return { 28 | selectedUser: {} // selected user data. Place this here to make sure it's reactive. 29 | } 30 | }, 31 | template: ` 32 |
33 |
34 |

User List

35 |

Click a user below and we'll use the User component now as a child component to display the data:

36 | 40 |
41 |
42 | 43 | 45 | 46 |
47 |
48 | `, 49 | methods: { 50 | loadUserData(id) { 51 | // this could be some ajax call to get user data from an API, but we'll just set some dummy data: 52 | this.selectedUser = id === 123 53 | ? { userId: 123 } 54 | : { userId: 456, userData: {age: 37, name: 'Patrick'}} 55 | } 56 | }, 57 | /* 58 | On the UserList component we use the User component as a child component 59 | and pass data down via props. 60 | */ 61 | components: { 62 | User 63 | } 64 | } 65 | 66 | const Sidebar = { 67 | template: `
This is the sidebar. No props here.
` 68 | } 69 | 70 | const NamedWrapper = { 71 | template: ` 72 |
73 |

Users loaded into named views:

74 | 78 |
79 | 80 | 81 |
82 |
83 | `, 84 | } 85 | 86 | 87 | 88 | 89 | /* Router and App setup: */ 90 | const routes = [ 91 | { 92 | path: '/user', 93 | name: 'userList', 94 | component: UserList 95 | }, 96 | 97 | // use /named as the parent route to wrap our two named views: 98 | { 99 | path: '/named', 100 | name: 'named', 101 | component: NamedWrapper, 102 | children: [ 103 | { 104 | path: '/user/:userId', 105 | name: 'named_id', 106 | components: { user_details: User, sidebar: Sidebar }, 107 | props: { user_details: true, sidebar: false } 108 | } 109 | ] 110 | }, 111 | { 112 | path: '/user/:userId', 113 | name: 'user', 114 | component: User, 115 | props: true, 116 | } 117 | ] 118 | 119 | const router = new VueRouter({ 120 | routes 121 | }) 122 | 123 | const app = new Vue({ 124 | router 125 | }).$mount('#app') -------------------------------------------------------------------------------- /docs/css/style.css: -------------------------------------------------------------------------------- 1 | #app { 2 | max-width: 800px; 3 | margin: auto; 4 | } 5 | 6 | nav.mainNav > * { 7 | padding: 0 0.75rem; 8 | text-decoration: none; 9 | } 10 | nav.mainNav > *:nth-last-child(n+2) { 11 | border-right: 1px solid #aaa; 12 | } 13 | 14 | .mainBody { 15 | border-top: 1px solid #ddd; 16 | border-bottom: 1px solid #ddd; 17 | margin: 1rem 0; 18 | padding: 1rem 2rem; 19 | min-height: 55px; 20 | } 21 | 22 | .userList { 23 | display: -webkit-box; 24 | display: -ms-flexbox; 25 | display: flex; 26 | -webkit-box-align: start; 27 | -ms-flex-align: start; 28 | align-items: flex-start; 29 | } 30 | .userList > * { 31 | -webkit-box-flex: 1; 32 | -ms-flex: 1; 33 | flex: 1; 34 | max-width: 50%; 35 | padding: 0 1rem; 36 | } 37 | 38 | .userLink:hover { 39 | cursor: pointer; 40 | } 41 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Vue Router Pass Params As Props 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |

Passing Route Parameters to Component Props

20 | 21 |

Using the User component on a route change:

22 | 30 | 31 |
32 | 33 |
34 |
35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /docs/js/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var User = httpVueLoader('./js/user.vue') 3 | var Sidebar = httpVueLoader('./js/sidebar.vue') 4 | var UserList = httpVueLoader('./js/user-list.vue') 5 | var NamedWrapper = httpVueLoader('./js/named.vue') 6 | 7 | 8 | 9 | /* Router and App setup: */ 10 | var routes = [{ 11 | path: '/users', 12 | name: 'userList', 13 | component: UserList 14 | }, 15 | { 16 | path: '/named', 17 | name: 'named', 18 | component: NamedWrapper, 19 | children: [{ 20 | path: 'user/:userId', 21 | name: 'named_id', 22 | components: { user_details: User, sidebar: Sidebar }, 23 | props: { user_details: true, sidebar: false } 24 | }] 25 | }, 26 | { 27 | path: '/user/:userId', 28 | name: 'user', 29 | component: User, 30 | props: true 31 | }]; 32 | 33 | var router = new VueRouter({ 34 | routes: routes 35 | }); 36 | 37 | var app = new Vue({ 38 | router: router 39 | }).$mount('#app'); 40 | -------------------------------------------------------------------------------- /docs/js/named.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 25 | 26 | 31 | 32 | -------------------------------------------------------------------------------- /docs/js/sidebar.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /docs/js/user-list.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 36 | 37 | 42 | 43 | -------------------------------------------------------------------------------- /docs/js/user.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | 19 | 24 | 25 | -------------------------------------------------------------------------------- /docs/scss/style.scss: -------------------------------------------------------------------------------- 1 | #app { 2 | max-width: 800px; 3 | margin: auto; 4 | } 5 | 6 | nav.mainNav { 7 | > * { 8 | padding: 0 0.75rem; 9 | text-decoration: none; 10 | } 11 | 12 | > *:nth-last-child(n+2) { 13 | border-right: 1px solid #aaa; 14 | } 15 | } 16 | 17 | .mainBody { 18 | border-top: 1px solid #ddd; 19 | border-bottom: 1px solid #ddd; 20 | margin: 1rem 0; 21 | padding: 1rem 2rem; 22 | min-height: 55px; 23 | } 24 | 25 | .userList { 26 | display: flex; 27 | align-items: flex-start; 28 | 29 | > * { 30 | flex: 1; 31 | max-width: 50%; 32 | padding: 0 1rem; 33 | } 34 | } 35 | 36 | .userLink { 37 | &:hover { 38 | cursor: pointer; 39 | } 40 | } -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 17 | --------------------------------------------------------------------------------