Vue自定义组件:

不论任何注册组件的方式:template属性有且仅有一个根节点标签

就是说模版属性的标签只能有一个在最外面

<div id="container-element">

  <mod-1></mod-1>

</div>

<script type="text/javascript">

  Vue.component("mod-1",{
template : "<h1>这是模版的标签</h1>"
}); let vueModel = new Vue({
el : "#container-element"
});
</script>

效果:

使用模版进行传值获取:

<div id="container-element">

  <mod-1 v-for="lang in items" v-bind:A="lang"></mod-1>

</div>

<script type="text/javascript">

  Vue.component("mod-1",{
props : ['A'],
template : "<h1>{{A}}</h1>"
}); let vueModel = new Vue({
el : "#container-element",
data : {
items : [
"java","c++","python","rust","linux"
]
}
});
</script>

效果:

这里值传递的很让人费解:

在模版组件这里的设置

然后是正常的vue指令编写,但是这个A注入就要注意一下

另一种注册组件的方式:

<template id="sample">
<h1>呵呵</h1>
</template>

像这样先使用模版声明好

    Vue.component("he-he", {
template : "#sample"
});

然后再声明组件,使用id选择绑定teamplate标签

私有组件和父子组件

使用Vue.component声明组件时,注册的是一个全局的组件,

允许在任意的一个Vue实例中使用该组件。

但是我们希望注册一个局部的私有组件,可将组件挂载到某个实例上面

私有组件:

    let privateComponent = Vue.extend({
template: "<h1>这是私有组件</h1>"
}); let vm = new Vue({
el : "#app",
components : {
"pc" : privateComponent
}
});

效果:

如果组件变量名称和components的属性名称一致可以不写k:v,直接写变量名称即可:

    let privateComponent = Vue.extend({
template: "<h1>这是私有组件</h1>"
}); let vm = new Vue({
el : "#app",
components : {
privateComponent
}
});

注意遵循驼峰命名:然后再使用组件时,命名以-分割,并且全小写:

<div id="app">
<private-component></private-component>
</div>

父组件 & 子组件

<div id="app">
<parent-com></parent-com> <!-- 最终渲染 -->
</div> <script type="text/javascript">
let childCom = Vue.extend({
template : `<h1>这是子组件!!!</h1>`
}); let parentCom = Vue.extend({
template :
`<div>
<h1>这是父组件!!!</h1>
<child-com></child-com>
</div>`,
components : { // 在父组件中声明子组件装载
childCom
}
}); let vm = new Vue({
el : "#app",
components : { // 在Vue实例中声明父组件装载
parentCom
}
})
</script>

效果:

组件的数据:

<div id="app">
<compo></compo>
</div> <script type="text/javascript">
let compo = Vue.extend({
template : `<h1>这是一个组件 {{msg}}</h1>`
}); let vm = new Vue({
el : "#app",
data : {
msg : "这是Vue实例的数据信息"
},
components : {
compo
}
});
</script>

可以看出来,我们的实例数据无法渲染在这个组件上面:

组件也可以具有data methods filter等等属性的对象,但是只有data的方式不一样

    let compo = Vue.extend({
template : `<h1>这是一个组件 {{msg}}</h1>`,
data (){
return {
msg : "这是子组件的消息msg"
}
}
});

然后页面的渲染恢复了正常:

为什么组件的数据data必须是一个方法的返回?

因为Vue会报错,其次每个组件都是一个独立的对象,如果不是独立将会导致数据公用问题:

就是一个组件被多个渲染,里面数据也将是共同使用,所以要以方法的形式返回

父子通信:


【Axios模拟后台传输的json数据】

{
"name" : "echo42",
"url" : "https://www.cnblogs.com/mindzone/p/13329771.html",
"page" : 10,
"gender" : true,
"address" : {
"country" : "中国",
"city" : "江西南昌",
"street" : "北京东路1688号"
}, "links" : [
{
"name" : "qqZone",
"url" : "https://user.qzone.qq.com/1791255334"
}, {
"name" : "acFun",
"url" : "https://www.acfun.cn/u/8680899"
}, {
"name" : "biliBili",
"url" : "https://space.bilibili.com/2931347"
}
]
}

页面:

<!DOCTYPE html>
<html lang="en"
xmlns:v-bind="http://www.w3.org/1999/xhtml"
xmlns:v-on="http://www.w3.org/1999/xhtml"
>
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
[v-clock] {
display: none;
}
</style>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js" ></script>
<script src="./../node_modules/_axios@0.19.2@axios/dist/axios.min.js"></script>
</head>
<body> <div id="container-element" v-clock> <!-- v-clock -->
<div></div> <a v-bind:href="info.url">绑定的个人地址</a> <!-- 利用v-bind完成对一些属性的赋值--> </div> <script type="text/javascript"> let vueModel = new Vue({
el : "#container-element", data(){
return{
info : {
name : null,
url : null,
page : null,
gender : null,
address : {
country : null,
city : null,
street : null
}, links : [
{name : null, url : null},
{name : null, url : null},
{name : null, url : null}
] } } }, mounted() {
axios.get('./json/data.json').then(response=>(this.info = response.data));
} });

【回顾JQuery的Ajax语法】

// 详细见W3CSchool https://www.w3school.com.cn/jquery/ajax_ajax.asp
$.ajax({
url : "${pageContext.request.contextPath}/xxx/xxx.action", // 请求发送地址
type : "post/get", // 请求方式/请求类型
dataType : "json", // 响应的数据格式
data : {
// 请求发送的数据
},
success : function (data) { // 后台有响应就会触发
// TODO ...
},
error : function () { // 一般请求异常会触发此回调函数
// TODO ...
},
async : true, // 是否异步请求:true / false 默认true
})

JQuery缩写版本:

$.get(
"urlAddress",
{
// data对象
},
function (responseData) {
// TODO 响应回调函数
}
);

$.post(
"urlAddress",
{
// data对象
},
function (responseData) {
// TODO 响应回调函数
}
);

【Axios语法】

// get请求
axios.get("requestUrlAddress?k1=v1&k2=v2&k3=v3&...").then(
function (response) {
// TODO 响应成功
},
function (err) {
// TODO 请求异常或者其他...
}
); // post请求
axios.post(
"requestUrlAddress",
{
// 参数对象
// K : V, ...
}
).then(
function (response) {
// TODO 响应成功
},
function (err) {
// TODO 请求异常或者其他...
}
);

axios要求post请求必须把参数统一在参数对象中声明【没试过地址传参,所以8知道】

原来axios是可以单独和原生JS或者JQuery结合使用,只是说配合Vue可以最佳实践吧

结合Vue也是一样的,在声明函数中声明axios发送异步请求

【笑话接口案例】

但是注意一点是Vue实例的data属性的数据会发生变化,需要在函数内作为变量接受一下再处理

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="./js/vue.min.js"></script>
<!--<script type="text/javascript" src="./js/axios.min.js"></script>-->
<script type="text/javascript" src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body> <div id="application">
<input type="button" value="点击或取随机笑话" @click="getJoke">
<p v-text="joke"></p>
</div> <script type="text/javascript">
let vueModel = new Vue({
el : "#application",
data : {
joke : "笑话案例"
},
methods : {
getJoke : function () {
let that = this; // 注意要在这里声明变量接受
axios.get("https://autumnfish.cn/api/joke").then(
function (response) {
console.log(response);
that.joke = response.data;
},
function (err) {
alert(err);
}
);
}
}
});
</script> </body>
</html>

【属性计算】

<!DOCTYPE html>
<html lang="en"
xmlns:v-bind="http://www.w3.org/1999/xhtml"
xmlns:v-on="http://www.w3.org/1999/xhtml"
>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./../node_modules/_axios@0.19.2@axios/dist/axios.min.js"></script>
</head>
<body> <div id="container-element" v-clock> <!-- v-clock --> <p>currentTimeInMethods : {{currentTimeInMethods()}}</p>
<p>currentTimeInComputed : {{currentTimeInComputed}}</p> </div> <script type="text/javascript">
let vueModel = new Vue({
el : "#container-element", data : {
message : "Hello,Echo42!!!"
}, methods : {
currentTimeInMethods : function () {
return Date.now();
}
},
computed : {
currentTimeInComputed : function () {
this.message;
return Date.now();
}
}
});
</script> </body>
</html>

【Vue】02 Component 组件 & Axios的更多相关文章

  1. Vue.js——component(组件)

    概念: 组件(Component)是自定义元素. 作用: 可以扩展HTML元素,封装可重用的代码. <div id="myView"> <!-- 把学生的数据循环 ...

  2. 怎样在 Vue 的 component 组件中使用 props ?

    1. 在注册一个组件时, 添加一个 props 属性, 将需要添加的 props 作为数组的元素进行添加, 比如下面的例子中, 我们添加了一个变量 name , 他就是一个 props, 我们可以通过 ...

  3. vue 组件开发、vue自动化工具、axios使用与router的使用(3)

    一. 组件化开发 1.1 组件[component] 在网页中实现一个功能,需要使用html定义功能的内容结构,使用css声明功能的外观样式,还要使用js定义功能的特效,因此就产生了一个功能先关的代码 ...

  4. day 84 Vue学习六之axios、vuex、脚手架中组件传值

    Vue学习六之axios.vuex.脚手架中组件传值   本节目录 一 axios的使用 二 vuex的使用 三 组件传值 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 axios的 ...

  5. 前端性能优化成神之路--vue组件懒加载(Vue Lazy Component )

    ---恢复内容开始--- 使用组件懒加载的原因 我们先来看看这样的一个页面,页面由大量模块组成,所有模块是同时进行加载,模块中图片内容较多,每个模块的依赖资源较多(包括js文件.接口文件.css文件等 ...

  6. Vue.js之组件(component)

    从结构上看,组件之于实例,就好比轮子之于汽车.从属性和方法来看,组件有实例的大部分方法,如果Vue实例是孙悟空,组件就好比实例的一个毫毛,变化多端却为Vue实例所用. 目录: 组件的注册 is的作用 ...

  7. 关于Vue的component制作dialog组件

    其实原理很简单,兴个粟子, 点击按钮出现 dialog 弹出杠, 将dialog做成一个组件,components/dialog.vue 就是在components里面新建一个vue.将这个vue做为 ...

  8. 手把手教你实现一个 Vue 进度条组件!

    最近在个人的项目中,想对页面之间跳转的过程进行优化,想到了很多文档或 npm 等都用到的页面跳转进度条,于是便想自己去实现一个,特此记录. 来看下 npm 搜索组件时候的效果: so 下面咱们一起动手 ...

  9. Vue 入门之组件化开发

    Vue 入门之组件化开发 组件其实就是一个拥有样式.动画.js 逻辑.HTML 结构的综合块.前端组件化确实让大的前端团队更高效的开发前端项目.而作为前端比较流行的框架之一,Vue 的组件和也做的非常 ...

  10. vue自定义全局组件(自定义插件)

    有时候我们在做开发的时候,就想自己写一个插件然后就可以使用自己的插件,那种成就感很强.博主最近研究element-ui和axios的时候,发现他们是自定义组件,但是唯一有一点不同的是,在用elemen ...

随机推荐

  1. webpack配置css预处理

    webpack默认只支持js的打包,不支持其它类型,为了让它支持样式的打包就需要加载一些loader 打包css文件 在webpack中配置对应的loader 在入口js文件中通过import导入样式 ...

  2. Linux Topicons Plus桌面工具安装

    Topicons Plus是Linux系统GNOME桌面环境的工具,方便于在工具栏显示应用小图标. 1.进入GNOME商店搜搜下载TopIcons Plus工具.下载路径:https://extens ...

  3. 无法删除此对象,因为未在 ObjectStateManager 中找到它。

    无法删除此对象,因为未在 ObjectStateManager 中找到它. 不能直接删除实体类, 用Service提供的: void Delete(long[] ids); void Delete(l ...

  4. 开源的Datadog?可观测性平台SigNoz是否名副其实?

    SigNoz号称自己是开源领域的Datadog,基于OpenTelemetry做了一套可观测性方案.夜莺从V6版本开始,也希望做全栈可观测性方案,巧了,大家目标一致,今天我们一起来对SigNoz做个初 ...

  5. 内部网关协议RIP-路由选择协议

    路由信息协议RIP(Routing Information Protocol)是内部网关协议IGP中最先得到广泛使用的协议,其相关标准文档为RFC1058. 一.RIP基本工作原理 RIP要求自治系统 ...

  6. OOM异常的4种可能分析及常见的OOM异常演示

    OOM异常的4种可能分析及常见的OOM异常演示 OOM异常: OutOfMemoryError 1.JAVA堆溢出JAVA堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到这些对象之间 ...

  7. 基于Python和TensorFlow实现BERT模型应用

    本文分享自华为云社区<使用Python实现深度学习模型:BERT模型教程>,作者: Echo_Wish. BERT(Bidirectional Encoder Representation ...

  8. Linux内核:通知链 机制

    Linux内核:通知链 机制 背景 在驱动分析中经常看到fb_notifier_callback,现在趁有空学习一下. 参考: https://www.cnblogs.com/armlinux/arc ...

  9. .Net Core 2.2 Areas 路由,第一个MapAreaRoute 设置匹配多个Controller

    .h2 { background-color: rgba(78, 110, 242, 1); color: rgba(255, 255, 255, 1); padding: 10px } 在.Net ...

  10. mybatis 逆行工程 附源码

    导读 逆向工程说白了,就可以简化开发工作量,自动生成一些死板的东西,比如POJO.映射文件等等,然后在将代码拷贝至实际工程,直接拿来用! 项目结构 GeneratorSqlMap.java impor ...