【Vue3从零开始-第一章】1-4 v-bind和component

简介: 【Vue3从零开始-第一章】1-4 v-bind和component

]UWOD(KIB9LJS9~S[T{QHM9.png


前言


本篇内容是第一章vue语法的最后一篇,通过本篇内容,我们将大致了解vue中的v-bind指令和组件的一些概念。大家可以通过下面链接了解vue的其他语法基础。


【Vue3从零开始-第一章】1-1 Hello world和计数器


【Vue3从零开始-第一章】1-2 v-on和v-if指令


【Vue3从零开始-第一章】1-3 v-for和v-model指令


下面的内容将在1-3的代码基础上带大家一起学习。


v-bind


在前面的几篇内容里面,我们经常会用到{{}}这样的格式去显示动态值,那么{{}}是什么意思呢?为啥可以显示出动态的值呢?


  • 在vue里面,{{}}表示插值表达式,在表达式里面可以做一些简单的js操作,也可以动态渲染data方法里面的值


  • 1-3的代码中,我们知道了双向数据绑定,在数据绑定的时候,我们也会用到这样的插值表达式去动态显示input中绑定的值。


Vue.createApp({
   data() {
     return {
       inputValue: ''
     }
   },
   template: `
    <div> 
       <input v-model="inputValue" /> 
       <div>{{inputValue}}</div>
    </div> `
 }).mount('#root');
复制代码


如果我们要在button标签上面,当鼠标放到标签上时,会显示inputValue的值,也就是给标签上的某个属性绑定一个动态值,我们可以不可以直接这样写呢?


template: `
    <div>
        <input v-model="inputValue" />
        <button v-on:click="handleAddItem" title="inputValue">增加</button>
    </div>
`
复制代码


3U4REV}4V4W$~_M3K2($CRU.png


在浏览器中打开后,我们发现按钮上的title属性显示的是一个字符串


inputValue,那我们可不可以在title属性中使用上面说的插值表达式呢?


template: `
    <div>
        <input v-model="inputValue" />
        <button v-on:click="handleAddItem" title="{{inputValue}}">增加</button>
    </div>
`
复制代码


3U4REV}4V4W$~_M3K2($CRU.png


  • 现在我们看到的是title属性直接显示了{{inputValue}}字符串,没有渲染出我们想要的效果,那么这时候我们就要用到一个新的指令: v-bind


  • 在使用v-bind时,不需要添加{{}}插值表达式的写法


template: `
    <div>
        <input v-model="inputValue" />
        <button v-on:click="handleAddItem" v-bind:title="inputValue">增加</button>
    </div>
`
复制代码


3U4REV}4V4W$~_M3K2($CRU.png


现在我们可以在浏览器中看到一个另类的双向数据绑定的效果了,也就是用v-binddata中的值动态绑定到标签的属性值中显示。


小结一下


  • {{}}插值表达式是在标签之间使用,且可以动态输出data中的值。


  • v-bind指令是在标签上使用,也可以动态输出data中的值。


component组件


组件的概念不仅仅在vue里面有效,在整个前端的发展中都是有效的。那什么是组件呢?


  • 组件就是一个页面上的一部分 下面的图片中显示的红色框和蓝色框都可以看做是一个又一个的组件


KZ_G{WJ_A%TVC7WOV~6ALDP.png


<li v-for="(item, index) of list">
    <div>
        <span>{{index}}</span>
        <span> - </span>
        <span>{{item}}</span>
    </div>    
</li>
复制代码


在项目中,我们往往会在一个标签里面嵌套很多标签来渲染我们需要显示出来的内容,但是这样的标签太多了之后,就会显得页面很臃肿,那么我们就可以把一些公共的地方拆分出来,单独做成一个组件去渲染。


下面我们就把1-3中的TodoList代码拆分出来。


首先我们要给vue的实例取一个名字


const app = Vue.createApp()
复制代码


为什么要取一个名字呢?因为我们要在这个app上去注册一些组件


app.component()
复制代码


注册组件之后呢,也要给这个组件取一个名字todo-item,后面跟着一个对象描述了这个组件对应的内容


app.component('todo-item', {})
复制代码


组件有了,我们就要将TodoList代码中的li标签拆分出来,然后开始写组件中的代码


const app = Vue.createApp({
    data(){
        return {
            inputValue: '',
            list: []
        }
    },
    methods: {
        handleAddItem(){
            this.list.push(this.inputValue)
            this.inputValue = ''
        }
    },
    template: `
        <div>
            <input v-model="inputValue" />
            <button v-on:click="handleAddItem">增加</button>
            <ul>
                <todo-item v-for="(item, index) of list" />
            </ul>
        </div>
    `
}).mount('#root');
app.component('todo-item', {
    template: '<div>hello world</div>'
})
复制代码


  • 我们在vue实例app上注册了一个组件,这个组件的名字叫todo-item,然后将组件放到ul标签中渲染出来


I)ZJ)~8`9M$1OXRLDD{RTTU.png


但是这时候我们刷新页面会发现,浏览器的Console报错了,找不到app.component这个方法。


那是因为我们在vue实例之后直接就挂载到root上了,挂载之后再去注册组件,是找不到组件的,那么我们就要改一下注册和挂载的逻辑顺序了。


const app = Vue.createApp({
    data(){
        return {
            inputValue: '',
            list: []
        }
    },
    methods: {
        handleAddItem(){
            this.list.push(this.inputValue)
            this.inputValue = ''
        }
    },
    template: `
        <div>
            <input v-model="inputValue" />
            <button v-on:click="handleAddItem" v-bind:title="inputValue">增加</button>
            <ul>
                <todo-item v-for="(item, index) of list" />
            </ul>
        </div>
    `
});
app.component('todo-item', {
    template: '<div>hello world</div>'
});
app.mount('#root');
复制代码


先注册一个vue实例,取名为app,然后在实例上注册一个组件todo-item,最后将实例挂载到root上渲染出来


GAL3XT]P`C8LH)V7@A]TQ$T.png


一个组件里面,不仅包含了这个组件的DOM结构,还应该包含这个组件的数据和js逻辑,从上面的组件代码中可以看到,我们在DOM结构上直接写死了数据,那下面我们就写一下组件上动态的渲染。


app.component('todo-item', {
    data(){
        return {
            item: 'Hello Dell'
        }
    },
    template: '<div>{{item}}</div>'
});
复制代码


  • 通过组件代码可以看出,组件里面的逻辑代码和vue实例里面的逻辑代码基本是一致的,都是通过data方法来定义动态的渲染值。


LGG$E(6[`G1G%(%3QN{Y86E.png


虽然组件已经动态渲染了data里面定义的值,但是不能每次都渲染同样的数据,应该让组件渲染vue实例中的list里面的每一项数据,那么我们就可以通过上面学到的v-bind指令来定义了。


<ul>
    <todo-item v-for="item of list" v-bind:content="item" />
</ul>
复制代码


  • 在组件上绑定一个属性,这个属性的名字叫content,值是itemitem就是list中的每一项值


app.component('todo-item', {
    props: ['content'],
    template: '<div>{{content}}</div>'
});
复制代码


  • vue实例中调用todo-item组件的时候,在组件上绑定了一个content的属性,那么组件上就要接收这个属性,在组件上用props接收一个叫content的属性值,并把这个属性值放到DOM中的插值表达式中渲染出来。


H%WRSB(RMP{SP%S{}HSM{1N.png


1-3中的例子中,我们还渲染了list的下标index,那么在组件中渲染出来也是需要从实例传给组件的,方法和上面的一样。


<ul>
    <todo-item v-for="(item, index) of list" v-bind:content="item" v-bind:index="index" />
</ul>
复制代码


app.component('todo-item', {
    props: ['content', 'index'],
    template: '<div>{{index}} - {{content}}</div>'
});
复制代码


  • 在调用todo-item组件的时候,同样绑定一个属性index,然后在组件中去接收index,同时用插值表达式渲染出来。


NA~C80CINQH%(}TIT3}_{PR.png


总结


在上面的例子中,我们都用到了v-bind指令来绑定一些属性值,同时也用到了组件和组件之间的传值的过程,有什么不明白的地方,可以在评论区留言讨论讨论哦~


本章节完,下章节继续哦!!!


相关文章
|
28天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
129 64
|
28天前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
109 60
|
3天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
17 3
|
28天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
33 8
|
27天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
30 1
|
27天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
38 1
|
28天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
JavaScript UED Windows
vue的学习之路(Vue中组件(component )
vue的学习之路(Vue中组件(component )
vue的学习之路(Vue中组件(component )
|
1月前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
7天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。

热门文章

最新文章