js 实现vue—引入子组件props传参
参考:https://www.cnblogs.com/xiaohuochai/p/7388866.html
效果

html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<title>js实现vue—引入子组件props传参</title>
<link rel="stylesheet" href="css/1.css">
<script type="text/javascript" src="js/jquery.js"></script>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script src="https://cdn.staticfile.org/vue-router/2.7.0/vue-router.min.js"></script>
<script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script>
<script src="js/1.js"></script>
</head>
<body>
<div id="app">
<keep-alive>
<router-view class="child-view" v-if="$route.meta.keepAlive"></router-view>
</keep-alive> <router-view class="child-view" v-if="!$route.meta.keepAlive"></router-view>
</div>
<script type="text/x-template" id="page1">
<div>
<TopNav :show-btn="ifShow"></TopNav>,
<!-- 对于props声明的属性来说,在父级HTML模板中,属性名需要使用中划线写法 -->
<p class="content">页面1</p>
<router-link to="/page2" tag="span" class="btnRouter">页面2</router-link>
<BlankPage id="BlankPage1"></BlankPage>
<!-- 多个组件引入同一组件改变显示/隐藏状态时,需绑定指定id,否则多个组件会混乱 -->
</div>
</script> <script type="text/x-template" id="page2">
<div>
<TopNav :show-btn="ifShow"></TopNav>
<p class="content">页面2</p>
<BlankPage id="BlankPage2"></BlankPage>
</div>
</script>
</body>
</html>
1.js
$(document).ready(function() {
Vue.prototype.$show = function(obj) { //全局函数1
var o = $(obj);
o.css('display', 'block');
};
Vue.prototype.$hide = function(obj) { //全局函数2
var o = $(obj);
o.css('display', 'none');
};
Vue.use(VueRouter);
// 顶部组件 start
var TopNav = Vue.extend({
data() {
return {
showBtn: false
}
},
props: ['showBtn'],
watch: {
showBtn: function(newVal, oldVal) {
this.showBtn = newVal;
}
},
template: "<p class='title'> " +
"<span>顶部组件</span>" +
"<span v-show='showBtn' class='btnBack' @click='$router.back(-1)'>返回</span>" +
"</p>"
})
/* 子级props属性声明时,使用小驼峰或者中划线写法都可以;
而子级模板使用从父级传来的变量时,需要使用对应的小驼峰写法
*/
// 顶部组件 end
// 正在加载组件 start
var BlankPage = Vue.extend({
template: "<div class='BlankPage'>" +
"<div class='loadingDiv'>" +
"<p class='loadingIcon'>" +
"<img src='img/load.gif' alt=''>" +
"</p>" +
"<p class='loadingTxt'>正在加载...</p>" +
"</div>" +
"</div>"
})
// 正在加载组件 end
// 页面1 start
var Page1 = Vue.extend({
data() {
return {
ifShow: false
}
},
template: "#page1",
// 局部注册子组件
components: {
TopNav,
BlankPage
}
})
//页面1 end
//页面2 start
var Page2 = Vue.extend({
data() {
return {
ifShow: true
}
},
template: "#page2",
components: {
TopNav,
BlankPage
}
})
//页面2 end
var router = new VueRouter({
routes: [{
path: '/',
name: 'Page1',
meta: {
index: 0,
keepAlive: true,
title: '页面1'
},
component: Page1
},
{
path: '/page2',
name: 'Page2',
meta: {
index: 1,
keepAlive: false,
title: '页面2'
},
component: Page2
}
]
})
router.beforeEach((to, from, next) => {
var toDepth = to.meta.index;
var fromDepth = from.meta.index;
if (to.meta.title) {
document.title = to.meta.title;
}
if (toDepth == 'undefined' || toDepth == undefined) {
if (true) {
//这个可以关闭安卓系统的手机
document.addEventListener('WeixinJSBridgeReady', function() {
WeixinJSBridge.call('closeWindow');
}, false);
//这个可以关闭ios系统的手机
WeixinJSBridge.call('closeWindow');
// wx.closeWindow();
}
return;
} else if (toDepth < fromDepth) { //返回
from.meta.keepAlive = false;
to.meta.keepAlive = true;
}
next()
})
var app = new Vue({
el: '#app',
router
}).$mount('#app')
})
1.css
@CHARSET "UTF-8";
body {
width: 100%;
height: 100%;
}
body,
div,
p {
margin: 0;
padding: 0;
text-align: center;
}
.content {
margin-top: 200px;
}
.title {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 60px;
padding-left: 50px;
line-height: .60px;
display: flex;
align-items: center;
color: #fff;
background-color: lightseagreen;
z-index: 1;
}
.btnBack {
margin-left: 50%;
}
.btnRouter {
width: 100px;
height: 30px;
line-height: 30px;
margin-top: 20px;
display: inline-block;
background-color: lightseagreen;
color: #fff;
border-radius: 10px;
}
.NoMore {
font-size: 14px;
color: #888;
margin-top: 30px;
text-align: center
}
#NoMore1,
#NoMore2 {
display: none;
}
.NoMoreTxt:before {
content: "";
width: 100px;
height: 1px;
display: inline-block;
margin-bottom: 5px;
margin-right: 1px;
background-color: #dadada;
}
.NoMoreTxt:after {
content: "";
width: 100px;
height: 1px;
display: inline-block;
background-color: #dadada;
margin-bottom: 5px;
margin-left: 10px;
}
#BlankPage1,
#BlankPage2 {
display: none;
}
.BlankPage {
width: 100%;
height: 100%;
font-size: 14px;
color: #fff;
background-color: #fff;
-webkit-transition: all .2s ease-out;
transition: all .5s ease-out;
transition: all .5s ease-out;
transition: all .5s ease-out;
position: fixed;
top: 0;
z-index: 12;
}
.loadingDiv {
position: fixed;
top: 45%;
left: 50%;
transform: translate(-50%, -50%);
width: 120px;
height: 50px;
}
.loadingTxt {
font-size: 14px;
color: #666;
text-align: center;
}
.loadingIcon {
text-align: center;
}
.loadingIcon img {
display: inline-block;
width: 40%;
height: 48px;
}
js 实现vue—引入子组件props传参的更多相关文章
- 40.VUE学习之--组件之间的数据传参父组件向子组件里传参,props的使用实例操作
父组件向子组件里传参,props的使用实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...
- vue非父子组件间传参问题
最近在使用vue进行开发,遇到了组件之间传参的问题,此处主要是针对非父子组件之间的传参问题进行总结,方法如下:一.如果两个组件用友共同的父组件,即 FatherComponent.vue代码 < ...
- Vue.js父与子组件之间传参
父向子组件传参 例子:App.vue为父,引入componetA组件之后,则可以在template中使用标签(注意驼峰写法要改成componet-a写法,因为html对大小写不敏感,component ...
- 【Angular】父组件监听子组件事件(传参)
Angular官方文档Demo地址:>component-interaction#parent-listens-for-child-event 举一个自己在写的项目
- Vue的组件及传参
目录 Vue的组件及传参 Vue组件的概念 根组件 子组件(局部组件) 父组件向子组件传值 子组件向父组件传值 Vue的组件及传参 Vue组件的概念 我们首先要知道组件的概念,实际上每一个组件都是一个 ...
- react第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参)
第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参) #课程目标 1.梳理react组件之间的关系 2.掌握父子传值的方法 3.掌握子父传值的方法 ...
- Vue 给子组件传递参数
Vue 给子组件传递参数 首先看个例子吧 原文 html <div class="container" id="app"> <div clas ...
- vue:页面跳转和传参(页面之间,父传子,子传父)
1.返回上一个页面: A.<a @click="$router.back(-1)" class="btn">重新加载</a> B.thi ...
- Vue 给子组件绑定v-model
父组件使用子组件时,使用v-model指令,在子组件中使用value获取props的值 父组件 <template> <div style="margin:20px;dis ...
随机推荐
- dfs套异或的包含性——cf986C好
很好的题,想了半天,官方题解的解法更好 这种异或问题的包含性在北邮的校赛里就出现过,需要认真学习一下 /* y和所有合法的x合并,如果没有剪枝,那么复杂度爆炸总共要判(2^n*2^n) 可以考虑如下优 ...
- c#种GetType()和TypeOf()的区别
C#中任何对象都具有GetType()方法,它的作用和typeof()相同,返回Type类型的当前对象的类型. typeof(x)中的x,必须是具体的类名.类型名称等,不可以是变量名称:GetType ...
- c++ 11新特性学习1
static_assert 静态断言,特点是编译期的断言检查 assert 运行时期的断言检查 二者参数用法相同
- arr = map(float,arr)输出问题
代码: arr = ['22','44','66','88']arr = map(float,arr)print(arr) 输出: <map object at 0x000001B48C30EE ...
- Java 并发工具包——ExecutorService常用线程池
1. 执行器服务 ExecutorService java.util.concurrent.ExecutorService 接口表示一个异步执行机制,使我们能够在后台执行任务.因此一个 Executo ...
- ## jvm知识点零碎整理
1.初始化VM options配置 idea安装目录\bin\idea.exe.vmoptions 和 idea64.exe.vmoptions可以看到初始配置: -Xms128m (设置初始化堆内 ...
- Java设计模式(一)外观模式(门面模式)- 结构型模式
模式的定义 门面模式(Facade Pattern)也叫做外观模式,是一种比较常用的封装模式,其定义如下:要求一个子系统的外部与其内部通信必须通过一个统一的对象进行.门面模式提供一个高层次的接口,使得 ...
- HDU 2167 状压dp方格取数
题意:给出一个数表,规定取出一个数后周围的八个数都不可取,求可获得的最大数字和 思路:状态压缩dp,每一行的取数方法为状态,显然,由于取数规则的限制,可取的状态并不是 1<<size_co ...
- iOS开发系列-自动化分发测试打包
概述 项目在测试阶段需要频繁打包给测试人员,对于这些固定化的操作我们可以使用自动化的手段去解决,将时间放在有意义的事情上. xcodebuild 是苹果发布自动构建的工具. Shell脚本打包 xcr ...
- JS函数 函数的作用,可以写一次代码,然后反复地重用这个代码。
什么是函数 函数的作用,可以写一次代码,然后反复地重用这个代码. 如:我们要完成多组数和的功能. var sum; sum = 3+2; alert(sum); sum=7+8 ; alert(sum ...