В настоящее время я работаю с Vue, и у нас есть основной экземпляр Vue с несколькими компонентами в формате .vue
. Однако, когда мы используем Socket.IO, мы должны создать экземпляр Socket.IO в компоненте. Есть ли способ создать экземпляр Socket.IO в нашем основном экземпляре Vue и передать его компонентам?Передача данных в компонент Vue?
ответ
Вы можете создать его экземпляр в родителе, а затем передать его детям через $broadcast
и $on
:
new Vue({
...
data: {
sock: {}
},
compiled: function(){
this.sock = io('http://192.168.10.10:3000');
this.$broadcast('socketReady',this.sock);
}
...
});
var someChild = new Vue({
...
data: {
sock: {}
}
compiled: function(){
this.$on('socketReady', function(sock){
this.sock = sock;
socket.on(
"test-channel:App\\Events\\EventName",
function(message){
//do something with message
}
);
});
}
...
})
Обычный способ передачи данных к компонентам будет через свойства. https://vuejs.org/guide/components.html#Props
Прохладная вещь с Vue заключается в том, что вы можете двусторонне связать эти реквизиты!
Вот пример того, как это может выглядеть в вашем случае.
new Vue({
data: {
connected: false
},
ready: {
createConnection.then(function() {
connected = true;
});
}
});
Шаблон:
<component :connected="connected"></component>
Компонент:
Vue.component('component', {
props: {
connected: {
type: Boolean,
required: false,
twoWay: true
}
}
});
Вы можете использовать ту же технику, чтобы передать объект соединения и двухстороннюю связать его.
Вы можете объявить его глобально в main.js или что-то еще, что вы используете для создания экземпляра vue, и оно будет доступно для использования в ваших компонентах. Я делал это с JQuery (модульно) во многих случаях.
Эта статья показывает один метод, включая библиотеки JS с Vue: https://vuejsdevelopers.com/2017/04/22/vue-js-libraries-plugins/
По существу, вы могли бы сделать что-то вроде этого:
var socket = // create socket here
Object.definePrototype(Vue.prototype, '$socket', { value: socket })
Затем вы можете использовать его как это:
new Vue({
mounted() {
console.log(this.$socket);
}
})
Однако, если вы используете модульный пакет, такой как Webpack, я бы предложил просто экспортировать экземпляр сокета из файла и импортировать его в любые компоненты n это.
Спасибо за это. Я использую реквизиты для передачи Socket.IO IP через экземпляр, знаете ли вы, могу ли я добавить опору в свой компонент, а затем использовать его в основном объекте Vue? – cheese5505
для каждого компонента нужен экземпляр сокета с другим IP-адресом? –