2015-09-24 3 views
1

Я нашел отличный пример использования маршрутизатора Vue. Вот файл app.js:Как интегрировать маршрутизатор Vue с Vue

// Telling Vue to use the router 
Vue.use(VueRouter) 

// Initializing the router with options 
var router = new VueRouter({ 
    history: false 
}); 

// Redirect certain routes to other routes 
router.redirect({ 
    '/': '/users/list' 
}) 

// Define your routes here. 
// NOTE: You'd normally do something 
// like require('./home/index.vue') for the component 
router.map({ 
    // Not found handler 
    '*': { 
     component: { 
      template: 
      '<div>' + 
      '<h1>Not Found</h1>' + 
      '</div>' 
     } 
    }, 
    '/users': { 
     component: { 
      template: 
      '<div>' + // Wrap your views in one root html node so that the transitions work 
      '<h1>Users</h1>' + 
      '<ul class="nav nav-tabs">' + 
      '<li><a v-link="https://stackoverflow.com/users/list">List</a></li>' + 
      '<li><a v-link="https://stackoverflow.com/users/create">Create</a></li>' + 
      '</ul>' + 
      '<br>' + 
       // <router-view></router-view> is where the nested sub route views will appear. 
       // If you want the transitions to happen here you can copy the attributes on the router-view in codepen's HTML view and paste it here. 
      '<router-view></router-view>' + 
      '</div>' 
     }, 
     subRoutes: { 
      '/list': { 
       component: { 
        template: 
        '<div>' + 
        '<ul><li><a v-link="https://stackoverflow.com/users/1/profile">Rick James</a></li></ul>' + 
        '</div>' 
       } 
      }, 
      '/create': { 
       component: { 
        template: 
        '<form>' + 
        '<div class="form-group">' + 
        '<input class="form-control" type="text">' + 
        '</div>' + 
        '<button class="btn btn-primary">Create</button>' + 
        '</form>' 
       } 
      }, 
      '/:id': { 
       component: { 
        template: 
        '<div>' + 
        '<h1>User Settings</h1>' + 
        '<ul class="nav nav-tabs">' + 
        '<li><a v-link="https://stackoverflow.com/users/{{route.params.id}}/profile">Profile</a></li>' + 
        '<li><a v-link="https://stackoverflow.com/users/{{route.params.id}}/posts">Posts</a></li>' + 
        '</ul>' + 
        '<br>' + 
        '<router-view></router-view>' + 
        '</div>' 
       }, 
       subRoutes: { 
        '/profile': { 
         component: { 
          template: '<div>Name: Rick James<br>Email: [email protected]</div>' 
         } 
        }, 
        '/posts': { 
         component: { 
          template: '<div><ul><li>Post Name 1</li><li>Post Name 2</li></ul></div>' 
         } 
        } 
       } 
      } 
     } 
    }, 
    '/different': { 
     component: { 
      template: '<div>' + 
      '<h1>Different</h1><p>{{ test }}</p>' + 
      '</div>', 
      data: function() { 
       return { 
        test: 'Hello I am a data variable from Vue.JS' 
       } 
      } 
     } 
    }, 
    '/about': { 
     component: { 
      template: 
      '<div>' + 
      '<h1>About</h1>' + 
      '<p>' + 
      'Well my father was a gambler down in Georgia,<br>' + 
      'He wound up on the wrong end of a gun.<br>' + 
      'And I was born in the back seat of a Greyhound bus<br>' + 
      'Rollin\' down highway 41.<br><br>' + 
      'Lord, I was born a ramblin\' man,<br>' + 
      'Tryin\' to make a livin\' and doin\' the best I can.<br>' + 
      'And when it\'s time for leavin\',<br>' + 
      'I hope you\'ll understand,<br>' + 
      'That I was born a ramblin\' man.' + 
      '</p>' + 
      '</div>' 
     } 
    } 
}); 

// Declaring the app itself 

var App = Vue.extend(); 

// Initializing the whole thing together 
router.start(App, '#app') 

Но я не знаю, где положить остальную часть кода. Например, вам нужно инициализировать Vue, не так ли? Где вы положили свои методы, ваши звонки в Вью ресурс и т.д. Я попытался добавить это:

var app = new Vue({ 
    el : '#app', 
    methods: { 
     alertTest : function() { 
      alert('hello'); 
     } 
    } 
}) 

Но я не знаю, как интегрировать. Для alertTest у меня есть событие v-on на одном из моих ссылок. Вот ссылка:

<a class="list-group-item" v-link="https://stackoverflow.com/users/list" v-on="click: alertTest">Users</a> 

Но событие не срабатывает. Я чувствую, что мне нужно связать первый блок кода (из учебника Майкла Дж. Калкина) во второй блок кода, чтобы событие срабатывало. Как мне это сделать? Я не знаю, где разместить остальную часть приложения, помимо маршрутизатора.

+0

Просматривая передовой пример для Вью маршрутизатора на Github, я не вижу Vue сам будучи инстанцированный. – sehummel

ответ

4

Я не уверен, но это просто отлично работает (используйте Vue.extend({}); вместо new Vue({});):

var App = Vue.extend({ 
    methods: { 
     alertTest : function() { 
      alert('hello'); 
     } 
    } 
}); 
router.start(App, '#app') 
+0

Я не знаю, почему я об этом не думал. Отличная работа. – sehummel

+0

В VueRouter 0.5.0 новый Vue только что сработал, но при переключении на 0.6.0 кажется, что нам нужно использовать расширение: | –

+0

вызов router.start (App, '#app') инициализирует новый экземпляр Vue. – retrograde

5

Вероятно, это слишком поздно, чтобы ответить. Недавно я также принял Vue.js и имел такое же сомнение. Во всей документации Vue.js экземпляр Vue создается с использованием нового Vue(), и когда я начал изучать vue-router, все это изменилось.

Обратите внимание, что, когда мы используем Vue вместе с Vue-маршрутизатором, есть несколько изменений API, которые мы должны учитывать.

Простой поток работы:

  • Создайте все компоненты, как показано ниже:

    var home=Vue.extend({template:"<div align='center'>Homepage</div>"}); var about=Vue.extend({template:"<div align='center'>About</div>"}); var contact=Vue.extend({template:"<div align='center'>Contact</div>"});

  • Создать приложение: [обратите внимание на изменения апи here.We не делают новый Vue() больше] var App = Vue.extend({});
  • Создайте и зарегистрируйте свой маршрутизатор как: var router = new VueRouter();
  • Зарегистрировать маршруты: router.map({ "/" : {component : home}, "/home" : {component : home}, "/about" : {component : about}, "/contact" : {component : contact}
    })
  • инициализации приложения: router.start(App, '#app'); Обратите внимание на этот шаг. Здесь мы инициализируем и запускаем приложение. Вместо обычного Vue api, где нам нужно зарегистрировать элемент, объявленный в приложении, как новый Vue (el: "# app), посмотрите, как изменился api, и теперь мы регистрируем элемент (#app) с помощью vue с указанным выше синтаксисом.
.

Другое дело, следует обратить внимание на другие варианты Vue [как данные, вычисленных, готовые и т.д.] все еще может быть предусмотрено, как показано ниже:

var App = Vue.extend({ 
data : function(){ 
    return { 
     message : "hello" 
    } 
} 

});

Note-1 Не забудьте назовите эти маршруты со своей страницы, например <a v-link={path:'/home'}.

Note-2 Не забудьте поместить все v-ссылки в область вашего #app в html, иначе ваши ссылки не будут доступны для кликов.

Для кого-то вроде меня, который является новым для javascript-мира, для меня работает только придерживание конвенций, представленных в рабочих примерах.

+1

То же самое, что мне не хватало в том, что когда вы не создаете экземпляр root Vue, а только родительский компонент, вы должны ** передавать данные как функцию **, в то время как вы можете передать объект ванили в настройках нового конструктора Vue. Я знаю, что это описано в вашем примере, но легко упустить эту деталь. –

+0

чрезвычайно полезное резюме для меня, спасибо большое. – Faraday88

1

Это простой пример для вас http://vue.tigerb.cn/

которые используют

"animate.css": "^3.5.2", 
"fastclick": "^1.0.6", 
"fetch": "^1.0.1", 
"font-awesome": "^4.7.0", 
"ratchet-npm": "^2.0.4", 
"vue": "^2.0.0", 
"vue-infinite-scroll": "^2.0.0", 
"vue-progressbar": "^0.7.0", 
"vue-router": "^2.0.0", 
"vuex": "^2.0.0", 
"whatwg-fetch": "^2.0.1"