html中创建并调用vue组件的几种方法汇总


Posted in Javascript onNovember 17, 2020

作者:Echoyya
出处:https://www.cnblogs.com/echoyya/

最近在写项目的时候,总是遇到在html中使用vue.js的情况,且页面逻辑较多,之前的项目经验都是使用脚手架等已有的项目架构,使用.vue文件完成组价注册,及组件之间的调用,还没有过在html中创建组件的经验,所以借此机会学习总结一下。

方法一:Vue.extend( options )

  • 用法:使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。data 选项是特例,需要注意 - 在 Vue.extend() 中它必须是函数
  • extend 创建的是 Vue 构造器,而不是我们平时常写的组件实例,所以不可以通过 new Vue({ components: testExtend }) 来直接使用,需要通过 new Profile().$mount('selector选择器') 来挂载到指定的元素上。
  • Vue.extend + vm.$mount 组合
// 借用官网的例子,小小改动了一下
// 在父组件中,创建一个子组件,并调用
<div id='app'>
  <button>{{message}}</button>
  <div id="mount-point"></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
 var vm = new Vue({
  el:"#app",
  data:{
   message:'父组件'
  },
 });
 // 创建构造器
 var Profile = Vue.extend({
  template: '<p>{{firstName}} {{lastName}} {{alias}}</p>',
  data: function () {
   return {
    firstName: 'N',
    lastName: 'H',
    alias: 'Y'
   }
  }
 })
 // 创建 Profile 实例,并挂载到一个元素上。
 new Profile().$mount('#mount-point')
 </script>

方法二:Vue.component( id, [definition] ) + Vue.extend( options )

用法:Vue.component()注册或获取全局组件。注册还会自动使用给定的 id 设置组件的名称

<div id="app">
 <!-- 如果要使用组件,直接把组件的名称以 HTML 标签的形式,引入到页面中-->
 <todo :todo-data="todoList"></todo>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
// 构建一个子组件
var todoItem = Vue.extend({
 template: ` <li> {{ text }} </li> `,
 props: ['text']
})

// 构建一个父组件
var todoWarp = Vue.extend({
 template: `
  <ul>
   <todo-item v-for="(item, index) in todoData" v-text="item.text"></todo-item>
  </ul>
  `,
 props: ['todoData'],
 // 局部注册子组件
 components: {
  //使用 components 定义组件时,若组件名称使用驼峰命名,则在引用组件时,需要把大写改为小写,并且用'-'将单词连接
  todoItem: todoItem
 }
})
// 注册到全局
Vue.component('todo', todoWarp) // 等同于下面这种写法
Vue.component('todo',Vue.extend({
 template : 'xxx',
 props:[xxx],
 components:'xxx'
}))

new Vue({
 el: '#app',
 data: {
  todoList: [
   { id: 0, text: '工作' },
   { id: 1, text: '学习' },
   { id: 2, text: '休息' }
  ]
 }
})
</script>

方法三:直接使用Vue.component()

<div id="app">
 <mycom></mycom>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
 Vue.component('mycom',{
  template : '<h3>这是使用 Vue.component 创建的组件</h3>'
 })
 new Vue({
  el: '#app'
 })
</script>

但是这样写会有一个问题:在h3标签后出现另一个标签,就会出问题,

Vue.component('mycom',{
 template : '<h3>这是使用 Vue.component 创建的组件</h3><h3>这是使用 Vue.component 创建的组件</h3>'
})

html中创建并调用vue组件的几种方法汇总

  • 原因:组件template属性指向的模板内容,必须有且只能有唯一的一个根元素
  • 解决方法: 用唯一的div作为父元素,将多个子元素包裹

方法四:使用Vue.component()

在被控制的 #app 外面使用 template 元素,定义组建的HTML模板结构

<div id="app">
 <mycom></mycom>
</div>
<template id="tem1">
 <h1>这是 template 元素</h1>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
 Vue.component('mycom', {
  template: '#tem1'
 });
 new Vue({
  el: '#app'
 })
</script>

方法五:使用Vue.component() + is

<div id="app">
 <ul>
  <li is="todo-item" v-for="(todo,index) in todos " :title="todo" :key="index" @remove="removeTodo(index)"></li>
 </ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
 Vue.component('todo-item', {
  template: `
   <li>
    {{title}}
    <button @click="$emit('remove')">remove</button>
   </li>
  `,
  props: ['title']
 })
 new Vue({
  el: "#app",
  data: {
   todos: ["eating", "swimming", "reading"]
  },
  methods: {
   removeTodo: function (index) {
    this.todos.splice(index, 1)
   }
  }
 })

补充说明一下is属性:

有些 HTML 元素,诸如 ul、ol、table 和 select,对于可以出现在其内部元素是有严格限制的。而有些元素,诸如 li、tr 和 option,只能出现在特定的元素内部。这会导致我们使用这些有约束条件的元素时遇到一些问题。例如

<table>
 <blog-post-row></blog-post-row>
</table>

这个自定义组件 会被作为无效的内容提升到外部,并导致最终渲染结果出错。幸好这个特殊的 is attribute 给了我们一个变通的办法:

<table>
 <tr is="blog-post-row"></tr>
</table>

以上就是html中创建并调用vue组件的几种方法汇总的详细内容,更多关于html 创建调用vue组件的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
两个select多选模式的选项相互移动(示例代码)
Jan 11 Javascript
jQuery使用$.ajax进行即时验证实例详解
Dec 11 Javascript
JS表单验证的代码(常用)
Apr 08 Javascript
使用开源工具制作网页验证码的方法
Oct 17 Javascript
angular实现商品筛选功能
Feb 01 Javascript
js实现适合新闻类图片的轮播效果
Feb 05 Javascript
bootstrap vue.js实现tab效果
Feb 07 Javascript
JavaScript 用fetch 实现异步下载文件功能
Jul 21 Javascript
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
Jul 23 Javascript
解决vue中虚拟dom,无法实时更新的问题
Sep 15 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
Apr 23 Javascript
微信小程序实现列表的横向滑动方式
Jul 15 Javascript
解决vue项目中出现Invalid Host header的问题
Nov 17 #Javascript
vue的webcamjs集成方式
Nov 16 #Javascript
SpringBoot在yml配置文件中配置druid的操作
Nov 16 #Javascript
详解JavaScript原型与原型链
Nov 16 #Javascript
详解JavaScript执行模型
Nov 16 #Javascript
Vue 实现拨打电话操作
Nov 16 #Javascript
微信小程序实现页面左右滑动
Nov 16 #Javascript
You might like
改造一台复古桌面收音机
2021/03/02 无线电
PHP小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
php结合飞信 免费天气预报短信
2009/05/07 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
jQuery实用基础超详细介绍
2013/04/11 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
2014/09/04 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
详解Javascript中的Object对象
2016/02/28 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
利用Vue实现移动端图片轮播组件的方法实例
2017/08/23 Javascript
ES6 Array常用扩展的应用实例分析
2019/06/26 Javascript
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
Python编程之微信推送模板消息功能示例
2017/08/21 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
python获取Linux发行版名称
2019/08/30 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
2020/05/15 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
物流专业大学应届生求职信
2013/11/03 职场文书
信访工作者先进事迹
2014/01/17 职场文书
运动会邀请函范文
2014/02/06 职场文书
优秀学生获奖感言
2014/02/15 职场文书
学历公证委托书
2014/04/09 职场文书
文明礼仪标语
2014/06/13 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书
接收函
2019/04/22 职场文书