zoukankan      html  css  js  c++  java
  • vue初学(1)——简单TodoList实现

    vue初学——简单TodoList实现

    〇、引入vue.js文件

    <script type="text/javascript" src="./vue.js"></script>

    一、创建一个新vue示例

    var app = new Vue({
        el: '#app', //要绑定的元素id名字
        components: {}, //绑定的组件
        data: {}, //数据
        methods: {} //方法
    })
    

    二、不操作dom来显示数据

    • 在app中数据项写 list: [],添加数据;
    • 仅在html中写,<li v-for="for item in list">{{ item }}</li>,即遍历list中所有元素并显示在li中,其实就相当于之前js里的for in;

    三、点击提交动态生成列表

    这里要用到绑定事件,回忆一下之前的绑定事件方法:
    //原生js的绑定与解绑:
    var node = document.querySelector('选择器');
    node.addEventLitsener('事件类型','回调函数','是否冒泡');
    node.removeEventLitsener('回调函数');
    //jQuery绑定与解绑:
    var $node = $('选择器');
    node.on('事件类型','回调函数');
    node.off('回调函数');
    
    vue中的绑定事件

      可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。

    • 在要绑定的元素中:<button v-on:click='handleBtnClick'>提交</button>。也可以省写为:@click='handleBtnClick'
    • 在vue的methods中添加函数(方法):methods: { handleBtnClick: function() {} }

      v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定,也就是说,在vue中修改立马会在页面中显示,反向也一样。

    • <input type="text" v-model='inputValue'>,即将input得到的数据用inputValue表示,修改一个 另一个立马会跟着变,这是vue帮我们实现好了的——响应式。
    • 在vue对象里操作数据 要用this.xx,这里就是this.list.push(this.inputValue);

    四、前端模块组件化

      在 Vue 里,一个组件本质上是一个拥有预定义选项的一个 Vue 实例。

      这里将这里的列表单独变成一个component(组件):

    1、全局组件

    • 直接用Vue.component('组件名(驼峰命名法)', '组件对象')
    • 组件对象里这里用到了这几种属性:props(用于元件传递参数), templates(形成组件的模板,以后都按照这个来生成), methods(组件里的方法);
    • 假如组件名为 TodoItem, 则html中标签名(组件实例化)为todo-item(要有短横线);
    • v-bind:content='item'即组件里有content这个属性, 它的值由item获得
    Vue.component('TodoItem',{
        props: ['content'],
        template: "<li>{{ content }}</li>"
    })
    <todo-item v-for='item in list'
    			v-bind:content='item'>
    </todo-item>
    

    2、局部组件

      其实和上面差不多,只是定义的时候变为变量赋值的形式,且要在vue对象中进行注册, 即多声明一个属性 components: {TodoItem:TodoItem}

    五、点击条目删除

      这里是利用组件来删除条目, 所以是要将数据从子组件传到父组件,这里用事件来实现.

    • 在组件的template中加上事件绑定, 变为template: "<li @click='handleItemClick'>{{ content }}</li>", 即每次点击li就调用handleItemClick回调函数;
    • 其中handleItemClick回调函数中又调用vue中的 (emit 函数来触发父组件的事件, ``this.)emit('delete',this.index);``, 其中this.index作为参数传递给父组件的回调函数, 这之前已经在组件的props中加入index参数, index的作用是表示这是第几个元素,方便删除;
    • 最后只要在父组件中, 也就是vue对象的methods中加上delete的回调函数handleItemDelete来删除该条目即可.

    六、完整代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>TodoList2</title>
    	<script type="text/javascript" src="./vue.js"></script>
    </head>
    <body>
    	<div id="app">
    		<input type="text" v-model='inputValue'>
    		<button v-on:click='handleBtnClick'>提交</button>
    		<ul>
    			<!-- <li v-for="item in list">{{ item }}</li> -->
    			<todo-item v-for='(item,index) in list'
    						v-bind:content='item'
    						v-bind:index='index'
    						@delete='handleItemDelete'>
    			</todo-item>
    		</ul>
    	</div>
    	
    	<script>
    		// Vue.component('TodoItem',{
    		// 	props: ['content'],
    		// 	template: "<li>{{ content }}</li>"
    		// })
    		var TodoItem = {
    			props: ['content','index'],
    			template: "<li @click='handleItemClick'>{{ content }}</li>",
    			methods: {
    				handleItemClick: function() {
    					this.$emit('delete',this.index);
    				}
    			}
    		}
    		var app = new Vue({
    			el: '#app',
    			components: {
    				TodoItem: TodoItem
    			},
    			data: {
    				list: [],
    				inputValue: ''
    			},
    			methods: {
    				handleBtnClick: function() {
    					this.list.push(this.inputValue);
    					this.inputValue = '';
    				},
    				handleItemDelete: function(index) {
    					this.list.splice(index,1);
    				}
    			}
    		})
    	</script>
    </body>
    </html>
    
  • 相关阅读:
    Ext checkbox
    Ext4.1 grid 多选(可无checkbox)
    System.Web.HttpContext.Current.Session获取值出错
    Ext4.1 tree grid的右键菜单
    javascript innerHTML、outerHTML、innerText、outerText的区别
    EXT ajax简单实例
    C# 各版本更新简介
    C#与.Net Framework的各种版本和联系
    Ext4 简单的treepanel
    Ext4.1 Grid 分页查询
  • 原文地址:https://www.cnblogs.com/TRY0929/p/13095792.html
Copyright © 2011-2022 走看看