Vue入门:Vue常用的基本事件(v-for/v-on/v-model),实现Todo List项目为例

9 篇文章 0 订阅

VUE的MVVM模式:

不涉及DOM层操作,在数据层操作,当数据的变更,Vue中会根据数据的不同自动变更.

插值:数据绑定最常见的形式就是使用 {{...}}(双大括号)的文本插值:

使用 v-html 指令用于输出 html 代码

v-model 指令用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值。

按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。

1 v-for:Vue循环取数

v-for

这里已ul->li 循环显示多个li数据为例.

<body>
    <div id="app">
        <input type="text" />
        <input type="button" value="提交">
        <ul>
            <li v-for="item in list">{{item}}</li>
        </ul>
    </div>
</body>
</html>
<script type="text/javascript">
    var app = new Vue({
        el:"#app",
        data:{
            list:["第一课的内容","第二课的内容"]
        }
    })
</script>

<li v-for="item in list">{{item}}</li>

v-for是vue的循环,item in list就是for循环里面的操作,item等同于i累计变量-循环中的每一次数据,list则是vue实例对象中data属性的具体属性值,获取item循环值后,使用{{item}}就可以一次将数组循环中的所有值取出.

2 v-on:Vue绑定事件

v-on

给一个dom节点绑定事件在vue中使用v-o指定,如绑定点击事件v-on:click="响应该事件的函数"(v-o:click="handleBtn");

Tips:handleBtn等被v-on:绑定的函数处理事件一定是在vue声明实例的methods属性中去实现的.

<body>
    <div id="app">
        <input type="text" />
        <input v-on:click="handleBtn" type="button" value="提交">
        <ul>
            <li v-for="item in list">{{item}}</li>
        </ul>
    </div>
</body>
</html>
<script type="text/javascript">
    var app = new Vue({
        el:"#app",
        data:{
            list:["第一课的内容","第二课的内容"]
        },
        // 响应事件要定义在vue的methods方法中
        methods:{
            handleBtn: function(){
                alert("Btn is Click");
            }
        }
    })
</script>

3 v-model=数据的双向绑定

数据的双向绑定,指的是html中dom节点通过v-model绑定后可以vue声明实例中data属性值双向联动,即只要任何一边改变了,另一边也会自动随着改变,这对从服务器端请求获取数据后的赋值那简直是福音.

现在数据和 DOM 已经被建立了关联,所有东西都是响应式的.

已input输入框为例,<input type="text" v-model="inputValue"/>,这里v-model="inputValue",一定要声明到vue的data属性值下,

这样实现双向绑定,那么无论是input输入框用户输入改变,还是我们请求后端返回数据的改变,他们都会双向同步改变.

 

4 获取vue实例中data的属性值

我们在当前声明的vue实例中,直接通过this.属性key就可以获取指定的值,如下代码

<body>
    <div id="app">
        <input type="text" v-model="inputValue"/>
        <input v-on:click="handleBtn" type="button" value="提交">
        <ul>
            <li v-for="item in list">{{item}}</li>
        </ul>
    </div>
</body>
</html>
<script type="text/javascript">
    var app = new Vue({
        el:"#app",
        data:{
            list:["第一课的内容","第二课的内容"]
            ,inputValue:''
        },
        // 响应事件要定义在vue的methods方法中
        methods:{
            handleBtn: function(){
                alert(this.inputValue);// 获取当前实例-app,data下的inputValue值,通过this即可
            }
        }
    })
</script>

5 对vue实例中data的属性值赋值

this.list.push(inputValue)
this.inputValue= ''

6 MVVM模式总结

从上面我们可以看出一点,我们真个操作,其实少掉我们之前写js或jQuery常常操作的dom代码,我们完全没有看到dom操作,都是直接在操作数据,前后端数据的改变,都会相应自动双向改变,这种就是现在非常流行的MVVM模式,VUE自己原话是这样写的:"虽然没有完全遵循 MVVM 模型,但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名表示 Vue 实例。"

7 Todo List 项目实例

<!DOCTYPE html>
<html>
<head>
    <title>TODO LIST</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="app">
        <input type="text" v-model="inputValue"/>
        <input v-on:click="handleBtn" type="button" value="提交">
        <ul>
            <li v-for="item in list">{{item}}</li>
        </ul>
    </div>
</body>
</html>
<script type="text/javascript">
    var app = new Vue({
        el:"#app",
        data:{
            list:["第一课的内容","第二课的内容"]
            ,inputValue:''
        },
        // 响应事件要定义在vue的methods方法中
        methods:{
            handleBtn: function(){
                this.list.push(this.inputValue);// 获取当前实例-app,data下的inputValue值,通过this即可
                this.inputValue = ''; // 点击后清空v-model绑定的输入框
            }
        }
    })
</script>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过自定义 Quill 的 toolbar 实现图片的拉伸、放大和缩小。 首先,你需要在 `vue-quill-editor` 的配置中添加一个自定义的 toolbar。例如: ``` <quill-editor v-model="content" :options="editorOption" > <div v-if="editorOption.toolbar"> <span class="ql-formats"> <select class="ql-size"> <option value="small"></option> <option selected></option> <option value="large"></option> <option value="huge"></option> </select> </span> <span class="ql-formats"> <button class="ql-stretch"></button> <button class="ql-zoom-in"></button> <button class="ql-zoom-out"></button> </span> <span class="ql-formats"> <button class="ql-image"></button> </span> </div> </quill-editor> ``` 然后,在 `mounted()` 钩子函数中获取 Quill 实例,并添加自定义的 toolbar 按钮的逻辑。例如: ``` mounted() { this.$nextTick(() => { const quill = this.$refs.myQuillEditor.quill const stretchButton = quill.getModule('toolbar').container.querySelector('.ql-stretch') const zoomInButton = quill.getModule('toolbar').container.querySelector('.ql-zoom-in') const zoomOutButton = quill.getModule('toolbar').container.querySelector('.ql-zoom-out') stretchButton.addEventListener('click', function() { // todo: 进行图片拉伸的逻辑 }) zoomInButton.addEventListener('click', function() { // todo: 进行图片放大的逻辑 }) zoomOutButton.addEventListener('click', function() { // todo: 进行图片缩小的逻辑 }) }) } ``` 其中,`quill.getModule('toolbar').container` 获取到的是 Quill 的 toolbar 容器,可以通过 `querySelector()` 方法获取到自定义按钮的 DOM 元素并添加事件监听器。 接下来,你需要实现图片拉伸、放大和缩小的逻辑。可以通过 Quill 的 Delta API 获取到当前选中的图片,并对其属性进行修改。例如: ``` stretchButton.addEventListener('click', function() { const range = quill.getSelection() if (!range) return const [image] = quill.getSemanticHTML(range.index, range.length).match(/<img.*?>/g) if (image) { quill.updateContents(new Delta().retain(range.index).delete(range.length).insert({ image: { ...Quill.Attributor.AttributeList.fromHTML(image), width: '200px', height: 'auto' } })) } }) ``` 上面的代码中,首先获取到当前选中的图片(即 `<img>` 标签),然后通过 Quill 的 `updateContents()` 方法修改图片的属性,例如将其宽度设置为 200px,高度设置为自适应。 类似地,你可以实现图片的放大和缩小。例如: ``` zoomInButton.addEventListener('click', function() { const range = quill.getSelection() if (!range) return const [image] = quill.getSemanticHTML(range.index, range.length).match(/<img.*?>/g) if (image) { const attr = Quill.Attributor.AttributeList.fromHTML(image) const width = parseInt(attr.width.replace('px', '')) const height = parseInt(attr.height.replace('px', '')) quill.updateContents(new Delta().retain(range.index).delete(range.length).insert({ image: { ...attr, width: `${width + 10}px`, height: `${height + 10}px` } })) } }) zoomOutButton.addEventListener('click', function() { const range = quill.getSelection() if (!range) return const [image] = quill.getSemanticHTML(range.index, range.length).match(/<img.*?>/g) if (image) { const attr = Quill.Attributor.AttributeList.fromHTML(image) const width = parseInt(attr.width.replace('px', '')) const height = parseInt(attr.height.replace('px', '')) if (width > 10 && height > 10) { quill.updateContents(new Delta().retain(range.index).delete(range.length).insert({ image: { ...attr, width: `${width - 10}px`, height: `${height - 10}px` } })) } } }) ``` 上面的代码中,首先获取到当前选中的图片的宽度和高度,然后将其分别增加或减少 10px。需要注意的是,当图片的宽度或高度小于等于 10px 时,不能再继续缩小了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值