当前位置: 首页 > news >正文

Vue基础起步

Vue基础起步


一 、用vue实现helloworld

代码

<div id="app">{{content}}</div>
    <script>
        var app = new Vue({
            el:"#app",
            data:{
                content:"hello world"
            }
        })
    </script>复制代码

浏览器效果如下


知识点

  1. 使用vue时,应该用 new Vue 创建一个vue实例,此处用app来接收这个实例

  2. el是指定Vue实例绑定哪个dom标签,就是说vue的操作范围是在哪个标签之内

    比如我现在把代码改为如下

    <div id="app">{{content}}</div>
    <div>{{content}}</div>
        <script>
            var app = new Vue({
                el:"#app",
                data:{
                    content:"hello world"
                }
            })
        </script>
    复制代码

    浏览器效果如下


    可以看到只要超出了div#app的范围,vue就不会去渲染数据

  3. vue是数据绑定是通过{{名字}}实现的,可以渲染出data{名字:数据}中的数据

  4. vue的好处是免去了dom的操作,我们只需要在数据上逻辑上做文章即可

    比如我们现在用原生js去实现上面的功能

    <div id="app"></div>
        <script>
            var app = document.getElementById("app");
            app.innerHTML = "hello world",
        </script>        复制代码
  5. vue是响应式的,只要数据一变化,视图 数据就会重新渲染

    var app = new Vue({
                el:"#app",
                data:{
                    content:"hello world"
                }
            })
            setTimeout(function(){
                app.$data.content="Bye world!"
    
            },1000)复制代码

    我们会看到,一秒之后,浏览器中出现了变化


    注意

    只有data中原本存在的属性被更新时,vue才会重新渲染,如果是app.$data.a=3后续添加data原本不存在的属性与值,vue是不会响应的

    Object.freeze(data)这样就会阻止修改限有的属性

二、用vue实现一个简易toDoList

所用知识点如下

v-model可以实现数据的双向绑定,dom中的数据可以影响到vue实例,vue实例的数据可以影响到dom的数据

<input type="text" v-model="inputValue">//vue中的datadata:{    inputValue:''}复制代码

data中的inputValuev-model中的inputValue 会同时变化,其中一个变化,另一个也跟着变化

  1. v-for="item in list"v-for会去遍历data中的list,item代指每一项

  2. $表示Vue实例所拥有的属性和方法,此外还有$.el,$watch。。。

  3. methods所有的事件都写在methods对象中,v-on:事件="事件函数"

    <button v-on:click="btnClick">提交</button>
    new Vue({
    	methods:{
    		btnClick:function(){
                        this.list.push(this.inputValue);
                        this.inputValue="";
                    }
    	}
    })复制代码

好了现在把代码和效果贴上来喽

  <div id="app">
        <input type="text" v-model="inputValue">
        <button v-on:click="btnClick">提交</button>
        <ul>
            <li v-for="item in list">{{item}}</li>
          
        </ul>
    </div>
    <script>
        var app = new Vue({
            el:"#app",
            data:{
                list:[],
                inputValue:''
            },
            methods:{
                btnClick:function(){
                    this.list.push(this.inputValue);
                    this.inputValue="";
                }
            }
        })
    </script>复制代码

效果图

使用组件改造todoList

知识点


  1. 全局组件的使用

    Vue.component('todoList',{})用来注册一个名字叫todoList的全局组件,{}是要传进去的参数,注意 todoList在html中要写作todo-list

    Vue.component('todoList',{    
        props:['content'],      template:'<li>{{content}}</li>'
    })复制代码
    • props:['content'],用来接收父组件传递的值

    • template:'',必填,展示模板的内容,注意千万不能写<li>this.$data.content</li>,会报错,而要写成<li>{{content}}</li>

    html

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

    v-bind:名字=“值” v-bind可以用来绑定数据,这里是v-for遍历父组件的list数据,用content来接收父组件的list中每一项(item)的值

    综上 在组件中中,用props:[‘content’] 来接受父组件的传值

    代码如下

    <div id="app">
            <input type="text" v-model="inputValue">
            <button v-on:click="btnClick">提交</button>
            <ul>
                <!-- <li v-for="item in list">{{item}}</li> -->
                <todo-list  v-bind:content="item" v-for="item in list"></todo-list>
              
            </ul>
        </div>
        <script>
            Vue.component('todoList',{
                props:['content'],
                template:'<li>{{content}}</li>'
            })
            var app = new Vue({
                el:"#app",
                data:{
                    list:[],
                    inputValue:''
                },
                methods:{
                    btnClick:function(){
                        this.list.push(this.inputValue);
                        this.inputValue="";
                    }
                }
            })
        </script>复制代码

  2. 子组件的使用

    形式跟父组件一样

    只不过写法不同

    var todoList = {
                props:['content'],
                template:'<li>{{content}}</li>'
            },
    //在vue的实例中
    new Vue({
    	components:{
    		todoList:todoList 
    	}
    })复制代码

三、父子组件的简单传值

我们要实现一个功能,点击列表信息时,删除该信息

效果如下


小知识点

v-on:click可以缩写为@click

v-bind:可以缩写为:bind

代码

 var todoList = {
            props:['content',"index"],
            template:'<li @click="deleteItem">{{content}}</li>',
            methods:{
                deleteItem:function(){
                    this.$emit("delete",this.index);
                }
            }
        }复制代码
  1. template中加入点击事件@click="deleteItem"

  2. 然后我们在子组件的methods加入一个点击事件函数deleteItem

    • emit可以用来触发父组件自定义的事件,第一个参数是自定义事件的名字, 后面的参数可以传参给父组件

  3. 父组件引用子组件的html代码

    <todo-list  
                    :content="item"
                    :index="index" 
                    v-for="(item,index) in list"
                    @delete="handleDeleteItem"></todo-list>复制代码

    @delete是父组件自定义的事件,当点击子组件时,子组件会自动触发该自定义事件,并把参数传过去

  4. 父组件的Vue实例中

    new Vue({
        methods:{
            handleDeleteItem:function(index){
                this.list.splice(index,1);
            }
        }
    })复制代码

    index就是子组件中$emit('delete',this.index)中的this.index传过来的参数

全部代码如下

<div id="app">
        <input type="text" v-model="inputValue">
        <button v-on:click="btnClick">提交</button>
        <ul>
            <todo-list  
                :content="item"
                :index="index" 
                v-for="(item,index) in list"
                @delete="handleDeleteItem"></todo-list>
          
        </ul>
    </div>
    <script>
        var todoList = {
            props:['content',"index"],
            template:'<li @click="deleteItem">{{content}}</li>',
            methods:{
                deleteItem:function(){
                    this.$emit("delete",this.index);
                }
            }
        }
        var app = new Vue({
            el:"#app",
            components:{
                todoList:todoList
            },
            data:{
                list:[],
                inputValue:''
            },
            methods:{
                btnClick:function(){
                    this.list.push(this.inputValue);
                    this.inputValue="";
                },
                handleDeleteItem:function(index){
                    this.list.splice(index,1);
                }
            }
        })
    </script>复制代码

结语

因为本人水平有限,如果有错漏的地方,还请看官多多指正

本文作者胡志武,写于2019/5/11,如果要转载,请注明出处,

如果觉得写的不错, 请点个赞吧




相关文章:

  • 如何动态获取Dubbo服务提供方地址列表
  • 谷歌智能音箱更新,玩转摄像头,但名归Nest麾下
  • C++STL算法
  • math模块
  • cs6.8-oracle挂载ceph
  • centos7二进制安装mysql8.0.16
  • PHP应用如何对接微信公众号JSAPI支付
  • Leetcode 11 - Container With Most Water
  • Oracle 12c:ORA-28040
  • 002-QC的使用
  • JavaScript 函数式编程技巧 - 反柯里化
  • 线程池没你想的那么简单
  • 第九周总结
  • 聊聊Dubbo(九):核心源码-服务端启动流程2
  • Nginx和Apache
  • ES6指北【2】—— 箭头函数
  • 【css3】浏览器内核及其兼容性
  • ES2017异步函数现已正式可用
  • gops —— Go 程序诊断分析工具
  • HTTP请求重发
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React+TypeScript入门
  • spark本地环境的搭建到运行第一个spark程序
  • swift基础之_对象 实例方法 对象方法。
  • TCP拥塞控制
  • 对象引论
  • 如何使用 JavaScript 解析 URL
  • 试着探索高并发下的系统架构面貌
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 微服务核心架构梳理
  • 微信开放平台全网发布【失败】的几点排查方法
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 学习JavaScript数据结构与算法 — 树
  • 一、python与pycharm的安装
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #git 撤消对文件的更改
  • #if和#ifdef区别
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (python)数据结构---字典
  • (第二周)效能测试
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)ssm高校实验室 毕业设计 800008
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原)Matlab的svmtrain和svmclassify
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [AIGC codze] Kafka 的 rebalance 机制