Vue组件介绍

vue

#基本示例

Vue组件的定义:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>这是Vue组件的学习</title>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

</head>

<body>

<!-- 这是Vue组件的学 -->

<h1>这是Vue组件的学习</h1>

<!-- 这里是使用-->

<!-- 怎么用呢? -->

<!-- 需要Vue实例 -->

<div id="app1">

<!-- 这里解决 Vue定的组件的加载问题 -->

为了能在模板中使用,这些组件必须先注册以便Vue能够识别.

这里有两种组件的祖册类型:全局注册和局部祖册.

至此,我们的组件都只是通过 Vue.component 全局注册的:

Vue.component('my-component-name',{

//options

})

全局注册的组件可以用在其被注册之后的任何(通过new Vue)新创建的Vue跟实例,也包括其组件树中的所有子组件的模板中.

<!-- 所以,注册的组件 在下面可以直接使用,Vue的实例 负责解析并呈现 最终效果 -->

<button-counter></button-counter>

</div>

<script>

// 这是注释

// 定义一个组件

// 组件的定义样式是:

// Vue.component('name',{vue object})

Vue.component('button-counter', {

data: function() {

// 返回一个<object>

//object>

return {

count: 0

}

},

template: `<button v-on:click ="count++">点击按钮{{count}}次</button>`

});

// 定义vue 实例

var vm = new Vue({

el: '#app1',

// 可以没有初始化数据

data: {

},

})

</script>

</body>

</html>

#data 必须是一个函数

component (组件)中的data ,必须是个函数,这是因为 组件是需要复用的,每次的复用,都相当于创建了一个新的实例.

这种情况跟 类(java)的实例情况类似. 否则将会出现不同组件公用 一个变量的情况,出现混淆及相互影响.

#通过 Prop 向子组件传递数据

prop的作用:类似组件的attribute,实现向组件中传值!

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>组件 prop 的学习</title>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

</head>

<body>

<h1>组件prop的学习</h1>

<h1>-------------------使用组件渲染的-----------------------</h1>

<div id="app">

<blog-post title="这是360中心情的其实篇"></blog-post>

<!-- 一下是 组件的复用 -->

<blog-post title="某一篇的测试文档"></blog-post>

<blog-post title="这是第三篇"></blog-post>

<h2>

我们来看上面组件的特点.

</h2>

<p>比如,我们使用html元素显示文本的时候,实在符号中间插入文本,比如 <>{在这个位置插入数据}</>

</p>

<p>而blog-post的数据.是写在 <span style="font-weight: bolder;color: red;"> 属性位置</span>的 </p>

<!-- 来看 -->

<blog-post title="三百六十五个夜晚!"></blog-post>

</div>

<h1>-------------------使用for 循环来渲染组件!-----------------------</h1>

<div id="#app2">

<!-- 使用for 循环来展示帖子 -->

<blog-post v-for="post in posts" v-bind:title="post.title" v-bind:key="post.id"></blog-post>

<p>我们来看 for 循环渲染的方式,与小程序的渲染方式的区别?</p>

<!-- 下面试小程序的渲染方式 -->

<view wx:for='{{posts}}' wx:for-item='post' wx:for-index='index' >{{index}},{{post.id}} ,{{post.title}}</view>

<p>形式不同,中心思想是一致的.== '套路是一致的'</p>

</div>

<script>

// 定义组件

Vue.component('blog-post', {

// 定义props

props: ['title'],

template: `<h4>{{title}}</h4>`

})

//

var vm = new Vue({

el: '#app',

data: {

// 可以为空

},

// 下面的也可以不用定义

})

var vm2 = new Vue({

el: '#app2',

data: {

posts: [{

id: 1,

title: 'My journey with Vue'

},

{

id: 2,

title: 'Blogging with Vue'

},

{

id: 3,

title: 'Why Vue is so fun'

}

]

}

})

</script>

</body>

</html>

#监听子组件事件

监听子组件的事件,关键是 组件内部的触发按钮的事件,需要在 组件中进行监听,并在 当前Vue实例中进行处理.

另外就是,子组件的数据传递问题,因为emit('function-name',args),中的args 很重要,这是针对不同item进行区别处理的关键参数.

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>博文</title>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

</head>

<body>

<div id="app">

<!-- 内容 -->

<div v-bind:style="{fontSize:postFontSize + 'em'}">

<blog v-for="post in posts" v-bind:key='post.id' v-bind:post="post"

v-on:enlarge-text='enlargeText'

v-on:audit='auditPost'>

</blog>

</div>

</div>

<!-- vue -->

<script>

// 定义组件

Vue.component('blog', {

props: ['post'],

// 这里面需要有数据吗?

template: `

<div class="blog-post">

<h3>{{post.title}}</h3>

<div v-html='post.content'></div>

<button v-on:click="$emit('enlarge-text')" >放大字号</button>

<button v-on:click="$emit('audit',post.id)">审核通过</button>

</div>`

})

var vm = new Vue({

el: '#app',

// 初始化数据

// 这里需要传入文章

data: {

postFontSize:1,

posts: [{

'id': 1,

'title': '资本论',

'content': '<p>这是由马克思写的一本书,我们来看看</p>'

},

{

'id': 2,

'title': '贫穷的本质',

'content': '<p>这是现代社会写的一本书</p>'

}

]

},

// 下面还可以有方法

methods: {

enlargeText: function() {

console.log('放大文章字号!')

this.postFontSize += 0.1

},

// 针对不同的帖子,需要进行不同的处理,这事需要进行特定数据的传递,就可以使用 emit('functionname',args)

// 形式进行内容传递

auditPost:function(e){

console.log('审核功能触发')

console.log(e)

// 通过获取的post id ,可以进行 更多针对帖子的操作.

}

}

})

</script>

</body>

</html>

前文讲过,组件注册有两种形式,一是 全局注册,另一个 局部注册!

#全局注册

形式:

Vue.component('my-component-name', {

// ... 选项 ...

})

#局部注册

var ComponentA = { /* ... */ }

var ComponentB = { /* ... */ }

var ComponentC = { /* ... */ }

new Vue({

el: '#app',

components: {

'component-a': ComponentA,

'component-b': ComponentB

}

})

对于 components 对象中的每个 property 来说,其 property 名就是自定义元素的名字,其 property 值就是这个组件的选项对象。

注,简单理解如下:

 'component-a' 是组件的名称,

 ComponentA 是组件对象.

 

注意局部注册的组件在其子组件中不可用。例如,如果你希望 ComponentA 在 ComponentB 中可用,则你需要这样写:

var ComponentA = { /* ... */ }

var ComponentB = {

components: {

'component-a': ComponentA

},

// ...

}

上例的意思就是,局部组件A,要在组件B中使用,就需要 首先在 B组件中注册(或者定义).

跟正常使用局部组件 情况一样!

#Prop

这是一个组件的能够鲜活并灵活使用的灵魂属性.

#Prop 类型

prop 可以是任何类型,-------------->意味着可以是object类型.为什么object类型这么重要呢?因为在进行项目开发的时候,每一个 数据表中的每一行数据,从数据库获得的时候,都可以认为是 一个object类型.它的所有字段,都是一个属性值.这项就方便进行动态的绑定处理.

props:[

String,

Number,

Boolean,

Array,

Object,

Function,

Promise

//or any other constructor

]

#Prop 验证

我们可以为组件的 prop 指定验证要求,例如你知道的这些类型。如果有一个需求没有被满足,则 Vue 会在浏览器控制台中警告你。这在开发一个会被别人用到的组件时尤其有帮助。

Vue.component('my-component', {

props: {

// 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)

propA: Number,

// 多个可能的类型

propB: [String, Number],

// 必填的字符串

propC: {

type: String,

required: true

},

// 带有默认值的数字

propD: {

type: Number,

default: 100

},

// 带有默认值的对象

propE: {

type: Object,

// 对象或数组默认值必须从一个工厂函数获取

default: function () {

return { message: 'hello' }

}

},

// 自定义验证函数

propF: {

validator: function (value) {

// 这个值必须匹配下列字符串中的一个

return ['success', 'warning', 'danger'].indexOf(value) !== -1

}

}

}

})

以上是 Vue组件介绍 的全部内容, 来源链接: utcz.com/z/377266.html

回到顶部