-
-
Save TahaSh/da262149f1ba0ba52ad8 to your computer and use it in GitHub Desktop.
<?php | |
function showModal($id, array $data = []) | |
{ | |
$toJSON = json_encode($data); | |
return "showModal('$id', $toJSON)"; | |
} |
Vue.transition('fade', { | |
enterClass: 'fadeIn', | |
leaveClass: 'fadeOut' | |
}); | |
Vue.transition('fadeWithMove', { | |
enterClass: 'fadeInDown', | |
leaveClass: 'fadeOutUp' | |
}); | |
Vue.component('modal-box', { | |
template: '#modal-box-template', | |
props: ['id', 'title'], | |
created: function() { | |
this.closeModal(); | |
}, | |
computed: { | |
isModalOpen: function() { | |
return this.$root[this.id + 'IsOpen']; | |
} | |
}, | |
methods: { | |
closeModal: function() { | |
this.$root.$set(this.id + 'IsOpen', false); | |
} | |
} | |
}); | |
new Vue({ | |
el: '#app', | |
data: { | |
modalData: {} | |
}, | |
methods: { | |
showModal: function(id, data) { | |
this.$set(id + 'IsOpen', true); | |
this.modalData = data; | |
} | |
} | |
}); |
html, body { | |
height: 100%; | |
} | |
body { | |
margin: 0; | |
padding: 0; | |
width: 100%; | |
display: table; | |
font-weight: 100; | |
font-family: 'Lato'; | |
} | |
.container { | |
text-align: center; | |
display: table-cell; | |
vertical-align: middle; | |
} | |
.content { | |
text-align: center; | |
display: inline-block; | |
} | |
.title { | |
font-size: 96px; | |
} | |
.Modal__container { | |
max-width: 700px; | |
width: 90%; | |
background: white; | |
border-radius: 2px; | |
animation-duration: 0.3s; | |
animation-delay: 0s; | |
} | |
.Modal__header { | |
border-bottom: 1px solid white; | |
padding: 15px 10px; | |
background-color: silver; | |
color: white; | |
border-radius: 2px; | |
} | |
.Modal__header > h1 { | |
font-size: 27px; | |
font-weight: normal; | |
margin: 0; | |
} | |
.Modal__content { | |
padding: 10px; | |
} | |
.Modal__footer { | |
padding: 5px; | |
} | |
.u-overlay { | |
position: fixed; | |
z-index: 1000; | |
top: 0; | |
left: 0; | |
width: 100%; | |
height: 100%; | |
background-color: rgba(0,0,0,0.8); | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
} | |
.naked-link { | |
color: inherit; | |
text-decoration: inherit; | |
} | |
/** Control the animation speed **/ | |
.animated { | |
animation-duration: 0.4s; | |
-webkit-animation-duration: 0.4s; | |
-moz-animation-duration: 0.4s; | |
} |
<!DOCTYPE html> | |
<html> | |
<head> | |
<title>Modal Boxes</title> | |
<link href="https://fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css"> | |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.1/animate.min.css"> | |
<link rel="stylesheet" href="/css/style.css"> | |
</head> | |
<body id="app"> | |
<div class="container"> | |
<div class="content"> | |
<a href="#" @click="{{ showModal('firstModal', ['foo' => 'FOO VALUE', 'bar' => 'BAR VALUE']) }}" class="naked-link title">First Modal</a><br> | |
<a href="#" @click="{{ showModal('secondModal') }}" class="naked-link title">Second Modal</a> | |
</div> | |
</div> | |
<template id="modal-box-template"> | |
<div @click="closeModal" v-show="isModalOpen" transition="fade" class="Modal u-overlay animated"> | |
<div @click.stop="" v-show="isModalOpen" transition="fadeWithMove" class="Modal__container animated"> | |
<header class="Modal__header"> | |
<h1> | |
@{{ title }} | |
</h1> | |
</header> | |
<div class="Modal__content"> | |
<slot></slot> | |
</div> | |
<footer class="Modal__footer"></footer> | |
</div> | |
</div> | |
</template> | |
<modal-box id="firstModal" title="First Modal"> | |
<p>Here is the body. @{{ modalData.foo }} and @{{ modalData.bar }}</p> | |
</modal-box> | |
<modal-box id="secondModal" title="Second Modal"> | |
<p>The body of the second modal.</p> | |
</modal-box> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.14/vue.min.js"></script> | |
<script src="/js/main.js"></script> | |
</body> | |
</html> |
vue-device.js:3156[Vue warn]: You are setting a non-existent path "firstModalIsOpen" on a vm instance. Consider pre-initializing the property with the "data" option for more reliable reactivity and better performance.warn @ vue-device.js:3156warnNonExistent @ vue-device.js:4884setPath @ vue-device.js:4927(anonymous function) @ vue-device.js:5085Vue.$set @ vue-device.js:11053closeModal @ vue-device.js:12257(anonymous function) @ vue-device.js:2353created @ vue-device.js:12245Vue._callHook @ vue-device.js:10372Vue._init @ vue-device.js:4601VueComponent @ VM10565:2build @ vue-device.js:7974mountComponent @ vue-device.js:7891(anonymous function) @ vue-device.js:7853(anonymous function) @ vue-device.js:7871cb @ vue-device.js:2504Vue._resolveComponent @ vue-device.js:11006resolveComponent @ vue-device.js:7873setComponent @ vue-device.js:7852bind @ vue-device.js:7812Directive._bind @ vue-device.js:10462linkAndCapture @ vue-device.js:9065compositeLinkFn @ vue-device.js:9034Vue._compile @ vue-device.js:10748Vue.$mount @ vue-device.js:11583Vue._init @ vue-device.js:4605Vue @ vue-device.js:1164712../components/table.vue @ vue-device.js:12442s @ vue-device.js:1e @ vue-device.js:1(anonymous function) @ vue-device.js:1
vue-device.js:3156 [Vue warn]: You are setting a non-existent path "secondModalIsOpen" on a vm instance. Consider pre-initializing the property with the "data" option for more reliable reactivity and better performance.warn @ vue-device.js:3156warnNonExistent @ vue-device.js:4884setPath @ vue-device.js:4927(anonymous function) @ vue-device.js:5085Vue.$set @ vue-device.js:11053closeModal @ vue-device.js:12257(anonymous function) @ vue-device.js:2353created @ vue-device.js:12245Vue._callHook @ vue-device.js:10372Vue._init @ vue-device.js:4601VueComponent @ VM10565:2build @ vue-device.js:7974mountComponent @ vue-device.js:7891(anonymous function) @ vue-device.js:7853(anonymous function) @ vue-device.js:7871cb @ vue-device.js:2504Vue._resolveComponent @ vue-device.js:11006resolveComponent @ vue-device.js:7873setComponent @ vue-device.js:7852bind @ vue-device.js:7812Directive._bind @ vue-device.js:10462linkAndCapture @ vue-device.js:9065compositeLinkFn @ vue-device.js:9034Vue._compile @ vue-device.js:10748Vue.$mount @ vue-device.js:11583Vue._init @ vue-device.js:4605Vue @ vue-device.js:1164712../components/table.vue @ vue-device.js:12442s @ vue-device.js:1e @ vue-device.js:1(anonymous function) @ vue-device.js:1
Hello Taha - Thanks for this code!
I'm getting the following warning in my console for each of the modals I'm attempting to load:
[Vue warn]: You are setting a non-existent path "modalSampleIdHereIsOpen" on a vm instance. Consider pre-initializing the property with the "data" option for more reliable reactivity and better performance.
Do you know how I might solve it?
Again, thanks!