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 相关文章推荐
文本框回车提交与禁止提交示例
Sep 27 Javascript
jQuery对Select的操作大集合(收藏)
Dec 28 Javascript
javascript用函数实现对象的方法
May 14 Javascript
深入解析JavaScript编程中的this关键字使用
Nov 09 Javascript
ES6中Math对象新增的方法实例详解
Apr 25 Javascript
JS触摸事件、手势事件详解
May 04 Javascript
JavaScript简单拖拽效果(1)
May 17 Javascript
vue父子组件的嵌套的示例代码
Sep 08 Javascript
微信小程序实现YDUI的ScrollTab组件
Feb 02 Javascript
微信小程序的mpvue框架快速上手指南
May 15 Javascript
jquery制作的移动端购物车效果完整示例
Feb 24 jQuery
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
Sep 27 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
Protoss兵种介绍
2020/03/14 星际争霸
我的论坛源代码(八)
2006/10/09 PHP
php中拷贝构造函数、赋值运算符重载
2012/07/25 PHP
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
php多线程实现方法及用法实例详解
2015/10/26 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
jQuery常用操作方法及常用函数总结
2014/06/19 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
jquery.validate表单验证插件使用详解
2017/06/21 jQuery
Angular实现响应式表单
2017/08/04 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
[57:59]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第一场 11.05
2020/11/05 DOTA
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
Python程序员面试题 你必须提前准备!
2018/01/16 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
蔻驰意大利官网:COACH意大利
2019/01/16 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
《青海高原一株柳》教学反思
2014/04/25 职场文书
纪律教育学习月活动总结
2014/08/27 职场文书
投标售后服务承诺书
2015/04/29 职场文书
PHP实现创建以太坊钱包转账等功能
2021/04/21 PHP