Vue模板语法(下)

简介: Vue模板语法(下)

事件处理器

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
    <style>
      .pink{
        width: 400px;
        height: 400px;
        background-color: pink;
      }
      .orange{
        width: 300px;
        height: 300px;
        background-color: orange;
      }
      .blue{
        width: 200px;
        height: 200px;
        background-color:rebeccapurple;
      }
      .green{
        width: 100px;
        height: 100px;
        background-color: green;
      }
    </style>
  </head>
  <body>
    <!-- 定义边界 -->
    <div id="app">
      <p>冒泡事件</p>
      <div class="pink" @click="pink">
        <div class="orange" @click="orange">
          <div class="blue" @click="blue">
            <div class="green" @click.stop="green"></div>
          </div>
        </div>
      </div>
      <p>点击夸你</p>
      <button @click.once="dosub">提交</button>
  </body>
  <script type="text/javascript">
    // 绑定边界 ES6具体体现
    new Vue({
      el: '#app',
      data() {
        return {
          f200: 'f200'
        };
      },
      methods: {
        pink() {
          alert("pink");
        },
        orange() {
          alert("orange");
        },
        blue() {
          alert("blue");
        },
        green() {
          alert("green");
        },
        dosub(){
          alert("兄弟,点的好");
        }
      }
    })
  </script>
</html>


冒泡事件


阻止事件冒泡




事件只能单击一次


什么是事件冒泡?


冒泡事件是指在Web开发中的事件传播过程中,事件从DOM树的最底层元素(通常是最具体的元素)向上冒泡到DOM树的根节点的过程。这种事件传播模型允许开发者在更高层次的元素上监听和处理事件,而不需要在每个具体的元素上都添加事件处理程序。


冒泡事件的传播过程可以简要描述如下:


事件首先从触发它的元素开始,然后向上冒泡到DOM树的根节点。

在这个过程中,每个祖先元素都有机会捕获并处理事件,如果它们注册了相应的事件处理程序。

如果事件处理程序返回true,事件将继续冒泡,直到到达根节点。

如果事件处理程序返回false或没有返回值,事件将停止冒泡,不会继续向上传播。

冒泡事件允许开发者在父元素上注册事件处理程序,以便捕获子元素触发的事件,从而提高了事件处理的效率和可维护性。




c35fae06c706407a8591ab7b88f6ccae.png


表单的综合案例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>表单</title>
  <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
</head>
<body>
  <div id="app">
    姓名:<input name="name" v-model="name"/><br />
    密码:<input type="password" v-model="pwd"/><br />
    性别:<span v-for="s in sexList">
      <input type="radio" :name="sex" v-model="sex" :value="s.id"/>{{s.name}}
    </span><br />
    籍贯:<select name="myAddr" v-model="myAddr">
      <option v-for="a in address" :value="a.id">{{a.name}}</option>
    </select><br />
    爱好:<span v-for="h in hobby">
      <input type="checkbox" v-model="myLike" name="myLike" :value="h.id"/>{{h.name}}
    </span><br />
    简介:<textarea v-model="sign" cols="20" rows="2"></textarea><br />
    是否同意:<input type="checkbox" v-model="ok"/><br />
    <button v-show="ok" @click="dosub">提交</button>
  </div>
  <script type="text/javascript">
    new Vue({
      el:'#app',
      data(){
        return {
          name:'',
          pwd:'',
          sexList:[
            { name:'男', id:1 },
            { name:'女', id:2 },
            { name:'不详', id:3 }
          ],
          hobby:[
            { name:'唱', id:1 },
            { name:'跳', id:2 },
            { name:'Rap', id:3 },
            { name:'篮球', id:4 }
          ],
          myLike:[],
          address:[
            { name:'湖南', id:1 },
            { name:'湖北', id:2 },
            { name:'河南', id:3 },
            { name:'河北', id:4 }
          ],
          myAddr:null,
          sign:null,
          ok:false,
          sex:null 
        };
      },
      methods:{
        dosub(){
          var obj = {};
          obj.name = this.name;
          obj.pwd = this.pwd;
          obj.sex = this.sex; 
          obj.address = this.myAddr;
          obj.love = this.myLike;
          obj.sign = this.sign;
          console.log(obj);
        }
      }
    });
  </script>
</body>
</html>



效果图:



组件通信


自定义事件


  监听事件:$on(eventName)


  触发事件:$emit(eventName)


  注1:Vue自定义事件是为组件间通信设计  


       vue中父组件通过prop传递数据给子组件,而想要将子组件的数据传递给父组件,则可以通过自定义事件的绑定


       父Vue实例->Vue实例,通过prop传递数据


       子Vue实例->父Vue实例,通过事件传递数据


  注2:事件名


       不同于组件和prop,事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称


       建议使用“短横线分隔命名”,例如:three-click

自定义组件

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>组件传参父传子</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <p>自定义组件</p>
      <my-<button type="button">liao</button>
      </div>
    <script type="text/javascript">
      new Vue({
        el:'#app',
        components:{
          'mybutton':{
            template:'<button>xx</button>'
          }
        },
        data(){
          return {
            msg:'123'
          };
        },
        methods:{
          fun1(){
            alert("fun1");
          }
        }
      });
    </script>
  </body>
</html>


效果图:



组件通信父传子

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>组件传参父传子</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <p>自定义组件</p>
      <button type="button">liao</button><br />
      <p>组件通信——父传子</p>
      <my-button m="纸"></my-button>
      <p>组件通信——父传子(纸)</p>
      <my-button m="翔" n="10"></my-button>
    </div>
    <script type="text/javascript">
      new Vue({
        el:'#app',
        components:{
          'my-button':{
            props:['m','n'],
            template:'<button @click="clickMe">被{{m}}点击了{{n}}次</button>',
            data:function(){
              return {
                n:1
              }
            },
            methods:{
              clickMe(){
                this.n++;
              }
            }
          }
        },
      });
    </script>
  </body>
</html>


效果图:

组件通信子传父

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>组件传参</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <p>组件通信——子传父</p>
      <my-button m="料" n="10" @xxx='getParam'></my-button>
    </div>
    <script type="text/javascript">
      new Vue({
        el:'#app',
        components:{
          'my-button':{
            props:['m','n'],
            template:'<button @click="clickMe">被{{m}}点击了{{n}}次</button>',
            data:function(){
              return {
                count:1
              }
            },
            methods:{
              clickMe(){
                let name = '来了';
                let bname = '开始来了';
                let info = '我tm来了';
                this.$emit('xxx', name, bname, info);
              }
            }
          }
        },
        data(){
          return {
            msg:'1234'
          };
        },
        methods: {
          getParam(a, b, c){
            console.log(a, b, c);
          }
        }
      });
    </script>
  </body>
</html>



效果图:


目录
相关文章
|
1天前
|
JavaScript
vue 监听 sessionStorage 中值的变化
vue 监听 sessionStorage 中值的变化
9 1
|
1天前
|
JavaScript 索引
Component name “index“ should always be multi-word vue/multi-word-component-names
Component name “index“ should always be multi-word vue/multi-word-component-names
|
1天前
|
JavaScript
vue 创建项目、运行项目、访问项目(vue2版)
vue 创建项目、运行项目、访问项目(vue2版)
6 0
|
1天前
|
JavaScript
|
1天前
|
JavaScript
Vue中data常见的写法:
Vue中data常见的写法:
|
1天前
|
JavaScript 编译器
|
1天前
|
JavaScript 前端开发 API
|
1天前
|
Web App开发 JavaScript
vue报错【解决方案】 [Violation] Added non-passive event listener to a scroll-blocking <some> event.
vue报错【解决方案】 [Violation] Added non-passive event listener to a scroll-blocking <some> event.
5 0
|
1天前
|
JavaScript
vue v-for循环渲染动态ref表单校验的实现技巧
vue v-for循环渲染动态ref表单校验的实现技巧
5 0
|
1天前
|
JavaScript 前端开发