Vue组件、组件通信、路由、axios、$event、$refs、跨域代理、element-ui

news2024/11/23 23:52:19

文章目录

  • { { } }插值表达式
  • $event
  • v-for
  • 删除、新增
  • axios方法优化
  • 启动 Vue项目
  • Vue项目的运行流程
  • 组件的三个结构
  • 组件的使用
  • 组件之间的通信
    • 父子 组件通信
    • 兄弟组件通信
  • 操作DOM
  • 插槽 slot
  • 移除node_modules
  • 路由
    • 安装、入门
    • 嵌套路由
    • 获取路由参数
  • 跨域代理
  • element-ui
    • 表单验证
    • Message 消息提示
    • 提示组件MessageBox弹框

{ { } }插值表达式

{ { } } 插值 表达式 只能作用在内容节点,适合 拼接内容,不能作用在 属性节点
v-bind 只能 作用在属性节点

<div id="app">
    <input type="button" v-bind:placeholder="tips">
</div>
<!-- 这样无法解析!!!  -->
<div  placeholder="{{tips}}"></div> 

<!-- 这样可以 ! ! !  -->
<div>{{tips}}</div> 

‘box’ 是 字符串box,index 是变量名,两者 进行字符串拼接

<div :title="'box'+index"> This a div </div>

{ { } } 还可以 进行 运算以及函数、三元运算~

{{number+1}}
{{number++}}
{{show=!show}}
{{ok?'ok':'no'}}
{{message.split('').reverse().join('')}}

$event

<!--  $event,原生DOM的事件对象e-->
<button @click="add(1,$event)">+N</button>
methods: {
   add(n, e) {
       console.log(n, e.target)
   }
}

e.target 就是 触发事件的DOM对象
在这里插入图片描述

methods: {
    add(n, e) {
        e.target.innerHTML='今天天气很好'
    }
}

点击之后:
在这里插入图片描述

<!--   只有 在按下Enter时执行submit函数-->
<input @keyup.enter="submit">
<!--   只有 在按下ESC时执行clearInput函数-->
<input @keyup.esc="clearInput">

注意:在标签中 使用this代表的是 window浏览器实例~~

<input @keyup.enter="submit(this)">

v-for

<!--   官方建议:只要用到 v-for指令,一定 要绑定 :key 属性-->
<!--   而且,尽量 把id 作为key的值-->
<!--   官方 对key的值类型,要求:数字或 字符串-->
<!--   key的值 不能重复!!!否则报错:Duplicate keys detected-->
<tr v-for="(item,index) in list" :key="item.id">
    <td>{{index}}</td>
    <td>{{item.id}}</td>
    <td>{{item.name}}</td>
</tr>

删除、新增

tr 使用 必须要加 <table> 标签!!!

<div id="app">
    <table>
        <tr v-for="item in list" :key="item.id">
            <td>{{item.id}}</td>
            <td>{{item.name}}</td>
            <td>{{item.status}}</td>
            <td>{{item.time}}</td>
            <td><a href="javascript:;" @click="remove(item.id)">删除</a></td>
        <tr/>
    </table>


</div>
<script type="application/javascript">
    var app = new Vue({
        el: '#app',
        data() {
            return {
                // 品牌的列表数据
                list: [
                    {id: 1, name: '宝马', status: true, time: new Date()},
                    {id: 2, name: '奔驰', status: true, time: new Date()},
                    {id: 3, name: '奥迪', status: true, time: new Date()}
                ]
            }
        },
        methods: {
            remove(id) {
                this.list = this.list.filter(item => item.id != id)
            }
        }
    })
</script>

新增

add() {
   this.list.push({id: 4, name: '奥迪', status: true, time: new Date()})
}

axios方法优化

<div id="app">
    <table>
        <tr v-for="item in books" :key="item.id">
            <td>{{item.id}}</td>
            <td>{{item.bookname}}</td>
            <td>{{item.author}}</td>
            <td>{{item.publisher}}</td>
        <tr/>
    </table>
    <input type="button" @click="getBooks" value="获取数据">


</div>
<script type="application/javascript">
    var app = new Vue({
        el: '#app',
        data() {
            return {
                // 书籍
                books: []
            }
        },
        methods: {
            async getBooks() {
                let {data: res} = await axios.get('http://www.liulongbin.top:3006/api/getbooks')
                this.books = res.data
            }
        }
    })
</script>

在这里插入图片描述

启动 Vue项目

npm install -g @vue/cli

链接:https://pan.baidu.com/s/10zhofYzlIY9buSxqiVRILQ
提取码:yyds
下载 demo 文件夹
在这里插入图片描述
进入 文件夹
在这里插入图片描述

npm cache clear --force    # npm 缓存清除--强制
cnpm install 			   # 安装 依赖
#  如果 没有 cnpm,先安装 cnpm 
#  npm install -g cnpm --registry=https://registry.npm.taobao.org

安装 完成 多了node_modules 文件夹
在这里插入图片描述

npm run dev # 启动项目

在这里插入图片描述

在这里插入图片描述

Vue项目的运行流程

在这里插入图片描述

相当于 使用 App.vue 组件 替换这个 <div id="app"></div>
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

组件的三个结构

在这里插入图片描述

<template>
  <!--有且仅有 一个根标签!且必须存在!-->
  <!-- 命名规范:
       {filename}-container
  -->
  <div class="test-container">
    {{ username }}
  </div>
</template>

<script>
//  默认导出,这是 固定写法!!!
export default {
  // data 数据源
  // 组件中的数据源 必须是 data(){} 函数
  data() {
    return {
      username: 'xiaoidng'
    }
  },
  methods: {
    changeName() {
      // this 是组件的实例
      this.username = 'xiaohong'
    }

  }
}
</script>

<style lang="less" scoped>

</style>

在这里插入图片描述

组件的使用

<script>
// 1.导入组件,在 默认导出外 进行!!
import app from '@/App.vue'

export default {
// 2.注册组件
  components: {
    app
  }
}
</script>

以标签的形式使用组件,必须 在哪注册就 在哪使用!!!

<app></app>

在 main.js 全局注册

// 导入需要被 全局注册的组件
import app from  '@/App.vue'
// 注册后,在任意组件都可以使用!!!
Vue.component('MyApp',app)

props 是 只读的

<template>
  <div class="App-container">
    {{ init }}
  </div>
</template>

<script>

export default {
  props: ['init']
}
</script>


注册 并且使用组件

<template>
  <div>
    <!-- 将 该组件的count 与app组件的 init属性绑定在一起~~ -->
    <app :init="count"></app>
  </div>
</template>

<script>
import app from '@/App.vue'

export default {
  data() {
    return {
      count: 10
    }
  },
  components: {
    app
  }
}
</script>

组件之间的通信

父子 组件通信

子组件

<template>
  <div class="App-container">
    <span>子组件的值:{{ count }}</span>
    <button type="button" @click="numChange">点我变化</button>
  </div>
</template>
<script>

export default {
  data() {
    return {
      count: 0
    }
  },
  methods: {
    numChange() {
      this.count = 10
      // 通知 父组件发生变化,带上 发生变化的值
      this.$emit('numChange', this.count)
    }
  }
}
</script>


父组件

此时 $event,也是 子组件传过来的值

<template>
  <div>
    <span>父组件的值:{{ count }}</span>
    <!-- 父组件 监听到,就 调用自己的 numChange方法-->
    <app @numChange="numChange"></app>
  </div>
</template>

<script>

import app from '@/App.vue'

export default {

  data() {
    return {
      count: 0
    }
  },
  components: {
    app
  },
  methods: {
    // 参数值是从 子组件传过来的
    numChange(val) {
      this.count = val
    }
  }
}
</script>

兄弟组件通信

在这里插入图片描述

操作DOM

<template>
  <div>
    <h1 ref="myref">今天天气很好 </h1>
    <button @click="change">点我改变</button>
  </div>
</template>
<script>

export default {
  data() {
    return {}
  },
  methods: {
    change() {
      // this.$refs.myref 代表 myref 这个DOM对象
      this.$refs.myref.style.color = 'red'
    }
  }
}
</script>

在这里插入图片描述

插槽 slot

作用 范围:
在这里插入图片描述

<template>
  <div class="App-container">
    <span>子组件</span>
    <!-- slot的name 默认为 default,这部分的内容 由使用插槽的人添加!!!-->
    <slot name="page"></slot>
  </div>
</template>

<script>

export default {
  data() {
    return {}
  }
}
</script>

调用方

<template>
  <div>
    <app>
      <!-- 在 组件内部 为插槽添加内容!-->
      <!-- 必须要 指定名字,v-slot 可以简写为 #-->
      <template #page>
        <p>今天天气很好哦!</p>
      </template>
    </app>
  </div>
</template>

<script>

import app from '@/App.vue'

export default {

  data() {
    return {
      count: 0
    }
  },
  components: {
    app
  },
  methods: {}
}
</script>

在这里插入图片描述

移除node_modules

cnpm i -g rimraf
# 进行 移除
rimraf node_modules

路由

安装、入门

在 src目录下 新建 router文件夹,在 router文件夹下 新建 index.js 文件

// 1. 导入Vue 和VueRouter的包
import Vue from "vue";
import VueRouter from "vue-router"
// 2. 调用Vue.use()函数,把VueRouter 安装为 Vue的插件
Vue.use(VueRouter)
// 3. 创建 路由的实例对象
const vueRouter = new VueRouter()

// 4. 向外共享路由的 实例对象
export default vueRouter
<template>
  <div class="App-container">
    <h1>今天天气很好!</h1>
    <!--  跳转连接  -->
    <router-link to="/movie">电影</router-link>
    <br>
    <router-link to="/about">关于</router-link>

    <router-view></router-view>
  </div>
</template>

在这里插入图片描述

import movie from "@/components/movie";
import about from "@/components/about";

const vueRouter = new VueRouter({
    // routes是一个数组,定义 `hash地址` 与 组件之间的关系
    routes: [
        // 当用户访问 /时,通过redirect 跳转到 /about对应的规则
        {path: '/', redirect: '/about'},
        {path: '/about', component: about},
        {path: '/movie', component: movie},
    ]
})

嵌套路由

在这里插入图片描述

<template>
  <div>
    <h1>钢铁侠</h1>
    <router-link to="/movie/say">点我</router-link>
    <router-view></router-view>
  </div>
</template>

路由 规则:

import movie from "@/components/movie";
import about from "@/components/about";
import tab from "@/components/tab";

const vueRouter = new VueRouter({
    // routes是一个数组,定义 `hash地址` 与 组件之间的关系
    routes: [
        // 当用户访问 /时,通过redirect 跳转到 /about对应的规则
        {path: '/', redirect: '/about'},
        {path: '/about', component: about},
        {
            path: '/movie',
            component: movie,
            children: [
                // 子路由规则,不加 / 线
                {path: 'say', component: tab}
            ]
        },
    ]
})

获取路由参数

在组件中 获取 路由参数的值

// 根据id 的值,获取对应电影的信息
{path: '/movie/:mid', component: movie, props: true}

开启 props传参

在 movie 组件 添加一个 mid属性

<script>
export default {
  props: ['mid']
}
</script>

在 movie 组件 获取参数值

{{ this.$route.params.mid }}

在这里插入图片描述
在这里插入图片描述

跨域代理

线上 需要 开启 API接口服务器的 CORS 跨域允许
在这里插入图片描述

element-ui

访问地址:点击

// 导入Vue 构造
import Vue from 'vue'
// 按需导入 element-ui组件
import {Button, Input} from 'element-ui'

// 注册需要的组件
Vue.use(Button)
Vue.use(Input)

 "plugins": [
        [
            "component",
            {
                "libraryName": "element-ui",
                "styleLibraryName": "theme-chalk"
            }
        ]
    ]

在这里插入图片描述

在这里插入图片描述

scope.row 代表这一行的数据

<el-table :data="tableData" style="width: 100%">
  <el-table-column prop="date" label="日期" width="180"></el-table-column>
  <el-table-column prop="name" label="姓名" width="180"></el-table-column>
  <el-table-column prop="address" abel="地址"></el-table-column>
  <el-table-column prop="创建时间" label="创建时间">
	    <template v-slot:default="scope">
	      {{ scope.row.date }}
	    </template>
  </el-table-column>
</el-table>

表单验证

<template>
  <div>
    <el-form :model="form" status-icon :rules="formRules" ref="form" label-width="80px" >
      <!-- prop 必须和 下面data中 form的内容一致-->
      <el-form-item label="用户姓名" prop="name">
        <el-input v-model="form.name" autocomplete="off"></el-input>
      </el-form-item>
      <!--  v-model.number:自动转为数字 保存到 form.age   -->
      <el-form-item label="用户年龄" prop="age">
        <el-input v-model.number="form.age" autocomplete="off"></el-input>
      </el-form-item>

      <el-form-item label="用户头衔" prop="position">
        <el-input v-model="form.position"></el-input>
      </el-form-item>

      <el-form-item>
        <el-button type="primary" @click="submitForm('form')">提交</el-button>
        <el-button @click="resetForm('form')">重置</el-button>
      </el-form-item>
    </el-form>
  </div>

</template>

<script>
export default {
  data() {
    // 声明 校验年龄的函数
    // value 填写的值
    // cb回调函数  cb(new new Error()) 代表出错
    // cb() 代表验证通过
    let checkAge = (rule, value, cb) => {
      if (!Number.isInteger(value)) {
        return cb(new Error('请填写整数'))
      }
      if (value > 100 || value < 1) {
        return cb(new Error('年龄必须在1到100岁之间!'))
      }
      cb()
    }
    return {

      // 要采集的用户的 信息对象
      form: {
        name: '',
        age: '',
        position: ''
      },
      // 表单的验证规则~
      formRules: {
        name: [
          {required: true, message: '姓名是必填项', trigger: 'blur'},
          {min: 1, max: 15, message: '长度在1到15个字符', trigger: 'blur'}
        ],
        age: [
          {required: true, message: '年龄是必填项', trigger: 'blur'},
          //validator 校验规则,trigger 触发时机
          {validator: checkAge, trigger: 'blur'}
        ],
        position: [
          {required: true, message: '头衔是必填项', trigger: 'blur'},
          {min: 1, max: 10, message: '长度在1到10个字符', trigger: 'blur'}
        ],
      }
    }
  },
  methods: {
    submitForm(formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          alert('submit!');
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    resetForm(formName) {
      this.$refs[formName].resetFields();
    }
  }
}
</script>

Message 消息提示

通过 main.js给原型加个 $message对象

import {Message} from "element-ui";

Vue.prototype.$message = Message
submitForm(formName) {
  this.$refs[formName].validate(async valid => {
    // 验证 没通过 直接返回,不发送请求
    if (!valid) return;
    // 需要 执行 添加的业务处理
    const {data: res} = await this.$http.post('/api/users', this.form)
    // this.$message 优化提示效果: Message消息提示
    if (res.status != 0) return this.$message.error("操作失败")
    this.$message.success("操作成功!")

  });
},
resetForm(formName) {
  this.$refs[formName].resetFields();
  this.$message.success("重置成功!")
}

提示组件MessageBox弹框

通过 main.js给原型加个 $confirm 对象

import {Message, MessageBox} from "element-ui";

Vue.prototype.$message = Message
Vue.prototype.$confirm = MessageBox
async resetForm(formName) {
  const confirmResult = await this.$confirm('此操作将重置表单, 是否继续?', '提示', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }).catch(err => err)
  if (confirmResult != 'confirm') return this.$message.info('取消重置')
  this.$refs[formName].resetFields();
  this.$message.success('重置成功')
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java+SQL Server开发(PC)学生管理系统【100010054】

题目学生管理系统 一、摘要 在当今互联网行业&#xff0c;Java 的使用及热度在各大排行榜中始终位于前列&#xff0c;通过本次课程设计&#xff0c;巩固所学 Java 知识&#xff0c;了解 Java 项目的开发流程。本程序是使用 Java 开发的一款学生管理系统&#xff0c;设计中使用…

微信开放小程序SDK,几款SDK产品对比分析

前言 这几天看到微信团队推出了一个名为 Donut 的小程序原生语法开发移动应用框架&#xff0c;通俗的讲就是将微信小程序的能力开放给其他的企业&#xff0c;第三方的 App 也能像微信一样运行小程序了。 其实不止微信&#xff0c;面对广阔的B端市场&#xff0c;阿里也早已开放…

kafka学习笔记

1. 官网 ​​​​​​​​​​​​​​​​​​​​​​​​​Apache Kafka 2. akf X轴拆分: 水平复制&#xff0c;就是讲单体系统多运行几个实例&#xff0c;做集群加负载均衡的模式,主主、主备、主从。解决单点&#xff0c;高可用问题 Y轴拆分: 基于不同的业务拆分 Z轴拆…

年底了,千万不要跳槽。

最近不少人在私信问我&#xff1a;做了几年 Java 工程师&#xff0c;现在很迷茫&#xff0c;想跳槽但是感觉底气不足&#xff0c;不知道如何是好。 作为一个资历不浅的 Java 开发&#xff0c;这几年我面试过不少人。发现大多数面试者&#xff0c;虽然看起来工作努力&#xff0…

FPGA 点亮LED灯

设计流程 首先对项目要有一个全局的考虑&#xff0c;分析项目需要几个模块构成&#xff0c;确定各个子模块的关系和信号之间 的相互关系&#xff0c;然后确定模块的端口信号有哪些&#xff1b;根据每个模块的功能并结合芯片、接口的时序手册画 出该模块能正常工作的时序波形图…

CSS3【垂直对齐方式、光标类型、 边框圆角 、overflow溢出部分显示效果 、元素本身隐藏】

文章目录二、装饰2.1 认识基线&#xff08;了解&#xff09;2.2 文字对齐问题2.3 垂直对齐方式2.4 小结2.5&#xff08;拓展&#xff09;项目中 vertical-align 可以解决的问题2.6 光标类型2.7 边框圆角2.8 边框圆角的常见应用2.9 小结2.10 溢出部分显示效果2.11 小结2.12 元素…

智慧医院信息化建设解决方案

【版权声明】本资料来源网络&#xff0c;仅用于行业知识分享&#xff0c;供个人学习参考&#xff0c;请勿商用。 【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间进行删除&#xff01; 完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 远程会诊 云…

Java的设计模式

本文档是学习后的个人总结&#xff0c;用于备查&#xff0c;如果有冒犯&#xff0c;请联系我删除。 参考文档&#xff1a; 1、简单工厂模式&#xff0c;工厂方法模式&#xff0c;抽象工厂模式 2、Java中常用的设计模式 上面这个链接写的特别清楚&#xff0c;也有代码示例&#…

记一次云服务器EIP出现异常对外攻击的问题

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 首先祝大家圣诞快乐&#xff0c;Merry Christma&#xff01; 中毒了 今天云主机运维人员告诉我说&#x…

【Flask框架】——26 ORM关联关系

1、表的外键关联 使用SQLAlchemy创建外键非常简单。在从表中增加一个字段&#xff0c;指定这个字段外键的是哪个表的哪个字段就可以了。从表中外键的字段&#xff0c;必须和主表的主键字段类型保持一致。 这种关联只关注数据表之间的外键关联&#xff0c;不考虑Python对象之间…

ORB-SLAM3代码和算法学习—双目和单目初始化

0总述 ORB-SLAM3算法中视觉的初始化依旧放在tracking线程中&#xff0c;因此在tracking中没有为imu模式设置单独的初始化函数&#xff0c;而IMU的初始化是在localMapping中实现的。 很有用的参考链接&#xff1a;https://cloud.tencent.com/developer/article/1761043 1双目…

【高阶数据结构】搜索二叉树

&#x1f308;欢迎来到数据结构专栏~~搜索二叉树 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句…

Word控件Spire.Doc 【评论】教程(2):在 C#、VB.NET 中删除和替换 Word 文档中的注释

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

130页5万字某市档案馆数字档案馆建设方案

【版权声明】本资料来源网络&#xff0c;仅用于行业知识分享&#xff0c;供个人学习参考&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间进行删除&#xff01; 完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 国家档案局证…

MySQL主从搭建

MySQL主从搭建一 主从配置原理二 搭建步骤&#xff08;基于两个docker容器&#xff09;三 django实现读写分离3.1 配置数据库3.2 models中创建表3.3 数据库迁移3.4 指定要使用的数据库四 Pycharm远程连接服务器进行代码的运行与调试五 Pycharm远程链接docker开发5.1 操作 docke…

SSM图书管理系统(增强版,附源码)

前篇引入&#xff08;新人必看&#xff09;&#xff1a;SSM图书管理系统&#xff08;原版&#xff09; 之前给大家分享过SSM图书管理系统项目的源码&#xff0c;热度较高&#xff0c;但我也发现功能并不是很全面&#xff0c;所以这次对系统进行了功能增强&#xff0c;以下是系…

新手入门搭建一个spring boot项目

1. 打开Idea,新建一个maven项目&#xff0c;详细情况见下图&#xff0c;&#xff08;idea版本2021.1.2&#xff09; 2.查看新建项目的maven包是否存在&#xff0c; 注意&#xff1a;maven包需要自己去下载&#xff0c;注意要下载与版本对应匹配的包 3.导入spring boot 相关的依…

springboot 连接不上 redis 的三种解决方案!

针对于springboot 连接不上 redis 这种情况&#xff0c;首先&#xff0c;我们最简单直接的方法就是需要确认Redis是否已经正常启动&#xff08;验证方法&#xff1a;如果安装在Linux下的话可以使用ps-ef|grep redis来进行确认是否开启&#xff09; 如果未开启&#xff0c;我们可…

STL-string的接口使用及模拟实现

文章目录string类的介绍string类的常用接口介绍 构造相关 无参构造字符串构造拷贝构造 容量相关的接口 sizereserveresizecapacityemptyclear 数据访问及遍历相关的接口 operator[]begin endrbegin rend 修改数据相关的接口 push_backoperatorinserterasec_strfind npossubs…

Redis搭建主从集群

搭建集群 建集群的第一件事情我们需要一些运行在 集群模式的Redis实例。这意味这集群并不是由一些普通的Redis实例组成的&#xff0c;集群模式需要通过配置启用&#xff0c;开启集群模式后的Redis实例便可以使用集群特有的命令和特性了。 下面是一个最少选项的集群的配置文件…