Web前端入门 - HTML JavaScript Vue

ps:刚开始学习web前端开发,有什么不正确、不标准的内容,欢迎大家指出~

Web简介

  • 90年代初期,Web1.0,静态页面,不和服务器交互,网页三剑客指Dreamweaver、Fireworks、Flash
  • 2000年代中期,Web2.0,动态页面,HTML是网页的结构,CSS是网页的外观,JavaScript是网页的行为。Ajax、jQuery等技术。
  • 2010年代,移动互联网,响应式设计、单页面应用、前后端分离、TypeScript 、ECMA标准。React、Angular、Vue等MVVM前端框架。

框架(web framework) :提供了整套的开发和部署网站的方式
模板引擎(template engine) :专注于将静态模板与动态数据结合生成最终的视图文件

学习顺序:HTML → CSS → JavaScript → jQuery → CSS3 → HTML5 → Vue等框架

web技术统计:https://w3techs.com/

HTML

<!DOCTYPE html>
<html>
<head>
    <title>这是网页的标题</title>
</head>
<body>
    <p>这是网页的内容</p>
    <!--注释的内容-->
</body>
</html>

head标签:

  • title标签 标题
  • meta标签 搜索 编码 自动跳转等
  • link标签 外部css
  • style标签 内部CSS
  • script标签 JavaScript
  • base标签 相对链接默认URL

body标签:

  • 文本 h1 p br div &nbsp;
  • 列表 ol li ul li dl dt dd
  • 表格 table tr td caption th
  • 图片 img
  • 超链接 a href
  • 表单 form input textarea select option
  • 框架 iframe

CSS

  • 外部样式表
  • 内部样式表
  • 行内样式表
选择器
{
    属性1 : 取值1;
    属性n : 取值n;
}

JavaScript

  • 外部JavaScript
  • 内部JavaScript
  • 元素事件JavaScript

一个浏览器窗口就是一个window对象:
在这里插入图片描述

变量:
var a = 10;
常量:
var DEBUG = 1;
控制:
if else  switch   while  do while   for 
函数:
function myFunction()
{
    alert("Hello World!");
}
数组:
var arr = ["HTML","CSS", "JavaScript"];
对象:
var person = {
    name:"John",
    age:50,
};
person.age = 51;
时间:
var d = new Date();

DOM:
当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model),为页面元素的树形结构。
•  元素节点  nodeType=1
•  属性节点  nodeType=2
•  文本节点  nodeType=3

获取元素:
•  getElementById()  只支持document
•  getElementsByTagName() 可操作动态DOM
•  getElementsByClassName()
•  querySelector()和querySelectorAll()  CSS选择器
•  getElementsByName() 只用于表单元素
•  document.title和document.body
示例:
var oDiv=document.getElementById("div1");
oDiv.style.color = "red";

创建元素节点 var e1 = document.createElement("元素名");
删除元素 A.removeChild(B);
复制元素 obj.cloneNode(bool)
替换元素 A.replaceChild(new,old);

事件:
•  鼠标事件
•  键盘事件
•  表单事件
•  编辑事件
•  页面事件

在页面输出内容:document.write()
弹出对话框:alert()
打开新窗口:window.open(url, target)
定时器:setTimeout(code, time);
周期执行:setInterval(code, time);

jQuery

轻量级JavaScript库,用于简化页面元素操作、事件处理、Ajax网络请求等。

jQuery 库包含以下特性:

  • HTML 元素选取
  • HTML 元素操作
  • CSS 操作
  • HTML 事件函数
  • JavaScript 特效和动画
  • HTML DOM 遍历和修改
  • AJAX
  • Utilities

基础语法:$(selector).action()

//隐藏 id="test" 的元素。
$("#test").hide()  
//文档就绪回调
$(document).ready(function(){
  // jQuery functions go here
});

网络请求

form标签的submit

早期提交请求的方式,会导致整个页面重新加载。

<form action="https://httpbin.org/post" method="post">
    <label for="name">Name:</label>
    <input type="text" id="name" name="name" required>
    <label for="email">Age:</label>
    <input type="number" id="age" name="age" required>
    <input type="submit" value="Submit">
</form>

AJAX

在不重载整个网页的情况下发起请求,更新页面的部分内容。
AJAX使用了浏览器提供的 XMLHttpRequest(xhr),而XMLHttpRequest是基于XML的HTTP请求。

var URL = 'https://httpbin.org/get?name=Ming&age=18';
var xhr = new XMLHttpRequest();
xhr.open('GET', URL, true);
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
        if (xhr.status === 200) {
            console.log(JSON.parse(xhr.responseText));
        } else {
            console.error('Error:', xhr.statusText);
        }
    }
};
xhr.send();

jQuery 封装 AJAX

jQuery对AJAX请求进行了封装:

// 从服务器加载数据,并把返回的数据放入被选元素中
$("#div1").load("demo.txt");
// 通过 HTTP GET 请求从服务器上请求数据
$("button_get").click(function(){
  $.get("demo_get",function(data,status){
    alert("Data: " + data + "\nStatus: " + status);
  });
});
// 通过 HTTP POST 请求从服务器上请求数据
$("button_post").click(function(){
  $.post("demo_post",
  {
    name:"Donald Duck",
    city:"Duckburg"
  },
  function(data,status){
    alert("Data: " + data + "\nStatus: " + status);
  });
});

Axios

Axios是一个独立的基于Promise的HTTP客户端,同时支持浏览器和node.js:在浏览器中使用XMLHttpRequest,在node.js中直接发送http请求。
而Promise是ES6中异步编程的新解决方案。

引入Axios:<script src="https://unpkg.com/axios@1.1.2/dist/axios.min.js"></script>

const URL = 'https://httpbin.org/get';
axios.get(URL, {
    params: {
        name: 'Ming',
        age: '18'
    },
}).then(response => {
    console.log(response.data);
}).catch(error => {
    console.error('Error:', error);
});

Fetch API

Fetch 是现代浏览器提供的原生API,代替了XMLHttpRequest。同样基于Promise。

const URL = 'https://httpbin.org/get?name=Ming&age=18';
fetch(URL)
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));

Vue.js

Vue简介

Vue是一款 MVVM(Model-View-ViewModel)框架。
在这里插入图片描述

  • View(视图层):DOM层,用户看到的界面。
  • Model(模型层):数据层,是来自服务器的或固定的数据
  • ViewModel(视图模型层):实现了数据绑定(Data Bindings),可以在Model层数据发生变化时将变化反映到View上。用户与View进行交互时,ViewModel层又可以通过监听DOM事件的变化,将监听到的变化反映给Model。

组件化:将MVVM中的VVM封装成一个组件,可重用。

采用虚拟DOM技术解决性能问题。

响应式:当数据改变后,会通知使用该数据的代码,从而改变使用到该数据的其他数据,进而使关联对应数据的视图自动更新。

API风格

  • 选项式API:通过props、data、methods等相关配置来组织功能逻辑,不同功能代码混合在一起。适合不使用构建工具或低复杂度场景。
  • 组合式API:同一个功能代码放到一起,不同功能分开,通过setup方法统一调用。适合使用Vue构建完整单页应用,并使用单文件组件。

使用Vue

推荐IDE
VSCode + Volar
WebStorm

使用Vue有两种方式:

直接引入<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

创建Vue应用:创建的项目使用基于 Vite 的构建设置,并允许使用 Vue 的单文件组件 (SFC)

#安装并执行 create-vue,它是 Vue 官方的项目脚手架工具
npm create vue@latest 
cd <your-project-name>
#安装依赖
npm install
#启动开发服务器
npm run dev
#打包
npm run build

工程目录:

+dist  打包生成的文件目录
+node_modules  安装的依赖包
+public 公共资源
  -favicon.ico  网站图标
+src  开发目录
  +assets  静态资源,图片、CSS等
  +components  所有Vue组件
  -App.vue  Vue根组件
  -main.js  入口js文件
-index.html  网站入口
-jsconfig.json  js相关配置
-package.json  项目配置和项目依赖
-vite.config.ts  构建相关配置

单文件组件(SFC)
即 *.vue 文件,将一个 Vue 组件的逻辑(JavaScript)、模板(HTML)与样式(CSS)封装在单个文件中。

<script setup>
import { ref } from 'vue'
const greeting = ref('Hello World!')
</script>

<template>
  <p class="greeting">{{ greeting }}</p>
</template>

<style>
.greeting {
  color: red;
  font-weight: bold;
}
</style>

Vue语法基础

html:

<div id="app">
  <button @click="count++">{{ count }}</button>
  <span>{{ myCount }}</span>
</div>

js:

import { createApp } from 'vue'
const app = createApp({
  data() {
    return {
      count: 0
    }
  }
  mounted() {
    console.log(this.count)
    this.count = 2
  }
  computed: {
    myCount() {
      return count + 5
    }
  }
})
app.mount('#app')
  • createApp()传入根组件,组件可以有子组件。
  • mount()挂载到DOM元素中,将组件中的内容渲染出来。
    当根组件没有设置 template 选项时,Vue 将自动使用容器的 innerHTML 作为模板。
  • data() 选项声明组件的响应式状态,返回对象的属性会被代理到组件实例(即this)上。
  • mounted()为挂载时的回调。
  • computed声明了计算属性,myCount的值会随着count的改变同步更新。
  • @click 是Vue的事件处理,等价于 v-on:click

数据绑定:

  • 文本插值:{{ count }} ,将count解释为纯文本

  • 插入HTML:<span v-html="rawHtml"></span>

  • 绑定attribute:<div v-bind:id="dynamicId"></div>
    v-bind支持简写,:id="dynamicId" 等价于 v-bind:id="dynamicId"
    若绑定的名字相同,可进一步简写,:id 等价于 :id="id"
    绑定多个attribute:

const objectOfAttrs = {
  id: 'container',
  class: 'wrapper'
}
<div v-bind="objectOfAttrs"></div>

条件渲染:

v-if 指令用于条件性地渲染一块内容。指令的表达式返回真值时才被渲染。

<div v-if="type === 'A'">
  A
</div>
<div v-else-if="type === 'B'">
  B
</div>
<div v-else>
  Not A/B
</div>

v-show 则仅切换元素的 display 属性。

<h1 v-show="ok">Hello!</h1>

列表渲染:

v-for 指令基于一个数组来渲染一个列表。

<li v-for="(item, index) in items">
  {{ index }} - {{ item.message }}
</li>

其中 items 是源数据的数组,而 item 是迭代项的别名。index是位置索引,可省略。

v-for 可以遍历对象的属性。也可以渲染范围值,初始值为1。

<li v-for="(value, key) in myObject">
  {{ key }}: {{ value }}
</li>
<span v-for="n in 10">{{ n }}</span>

表单输入绑定:

将表单输入的值同步给 JavaScript 中的变量。

<input v-model="userName">

Element UI

Element是基于Vue的UI组件库。其中Element Plus基于Vue3,使用了TypeScript+组合式API。
Element提供按钮、表单、表格、导航菜单等一系列组件,易于使用、风格统一、交互性良好。

安装:npm install element-plus --save

Vue3 + Element Plus 实现动态表格

在这里插入图片描述

首先创建Vue应用并安装Element Plus。
使用Vue单文件组件、组合式API。
Element还可以方便的实现表格排序、筛选、展开等功能。

main.js

import {createApp} from 'vue';
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css';
import App from './App.vue';

const app = createApp(App);
app.use(ElementPlus);
app.mount('#app');

App.vue

<template>
  <el-button @click="showDialog = true">添加用户</el-button>

  <el-dialog title="用户信息" v-model="showDialog">
    <el-form :model="userForm">
      <el-form-item label="名字">
        <el-input v-model="userForm.name"></el-input>
      </el-form-item>
      <el-form-item label="年龄">
        <el-input v-model.number="userForm.age"></el-input>
      </el-form-item>
      <el-form-item label="性别">
        <el-select v-model="userForm.gender">
          <el-option label="男" value="男"></el-option>
          <el-option label="女" value="女"></el-option>
        </el-select>
      </el-form-item>
    </el-form>
    <template #footer>
      <el-button @click="showDialog = false">取消</el-button>
      <el-button type="primary" @click="submitUser">提交</el-button>
    </template>
  </el-dialog>

  <el-table :data="users" style="width: 100%">
    <el-table-column prop="id" label="ID"></el-table-column>
    <el-table-column prop="name" label="名字"></el-table-column>
    <el-table-column prop="age" label="年龄"></el-table-column>
    <el-table-column prop="gender" label="性别"></el-table-column>
    <el-table-column label="操作">
      <template #default="scope">
        <el-button @click="editUser(scope.row)">修改</el-button>
        <el-button type="danger" @click="deleteUser(scope.$index)">删除</el-button>
      </template>
    </el-table-column>
  </el-table>
</template>

<script setup lang="ts">
import {ref} from 'vue';
import {ElButton, ElDialog, ElForm, ElFormItem, ElInput, ElSelect, ElOption, ElMessage} from 'element-plus';

const showDialog = ref(false);
const userForm = ref({
  id: 0,
  name: '',
  age: 0,
  gender: '男',
});
const users = ref([]);
const currentId = ref(0);
const editingIndex = ref(0);

function clearForm() {
  userForm.value = {id: null, name: '', age: 0, gender: '男'};
  editingIndex.value = null;
}

function submitUser() {
  if (!userForm.value.name || !userForm.value.age) {
    ElMessage.error('请填写完整的用户信息!');
    return;
  }
  if (editingIndex.value !== null) {
    // Update existing user
    users.value[editingIndex.value] = {...userForm.value};
  } else {
    // Add new user
    currentId.value += 1;
    userForm.value.id = currentId.value;
    users.value.push({...userForm.value});
  }
  showDialog.value = false;
  clearForm();
}

function deleteUser(index) {
  users.value.splice(index, 1);
  ElMessage.success('用户已删除!');
}

function editUser(user) {
  editingIndex.value = users.value.indexOf(user);
  userForm.value = {...user};
  showDialog.value = true;
}
</script>

其他常用js、css库

  • Bootstrap:提供了丰富的预定义样式和组件,便于开发响应式布局、移动端优先的项目
  • React:与Vue类似,是一个MVVM框架,用于构建大型、高效的Web应用
  • Underscore / Lodash:两者都提供了大量的JavaScript工具函数(如map、reduce、filter等)
  • Popper.js:用于处理定位问题(如工具提示、弹出框的定位)
  • Moment.js:用于处理日期和时间
  • Animate.css:包含一系列动画效果的CSS库 (如弹跳、闪烁、渐变、淡入淡出等)
  • Modernizr:用于检测浏览器的HTML5和CSS3支持情况
  • Polyfill.io:使旧浏览器支持现代网页特性

其他

  • Electron:利用Web前端技术进行桌面应用开发,支持Windows、Linux、Max平台。2023新版QQ就是用的Electron。
  • React Native:使用JavaScript并借助React库进行移动应用开发,支持安卓、iOS、微信小程序等。使用React Native开发的应用有Facebook、Instagram等。
  • H5游戏:渲染技术使用Canvas或WebGL(Three.js是基于WebGL的3D渲染库),网络通信使用WebSocket。可使用Egret、Cocos2d-js、Phaser、Babylon等H5游戏引擎。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Numpy 简易速速上手小册》第4章:Numpy 数学和统计计算(2024 最新版)

文章目录 4.1 基础统计运算4.1.1 基础知识4.1.2 完整案例&#xff1a;市场调研分析4.1.3 拓展案例 1&#xff1a;股市收益分析4.1.4 拓展案例 2&#xff1a;环境监测数据处理 4.2 线性代数运算4.2.1 基础知识4.2.2 完整案例&#xff1a;解线性方程组4.2.3 拓展案例 1&#xff1…

C Primer Plus第4章编程题

文章目录 printf()和scanf()的*修饰符C Primer Plus第4章编程题 1.printf()和scanf()的*修饰符 printf()和scanf()都可以用*修饰符来修改转换说明的含义。 printf()的*修饰符&#xff1a;如果你不想预先指定字段宽度&#xff0c;希望通过程序来指定&#xff0c;那么可以使用*修…

AI 神助攻,协同办公神器 ---- ONLYOFFICE

人工智能不会取代人&#xff0c;只会淘汰那些不会使用人工智能的人。 – 鲁迅 一、人工智能重新定义办公新模式 随着GPT的横空出世&#xff0c;AI的应用场景已经无处不在&#xff0c;从智能客服、智能语音助手、智能家居到自动驾驶汽车等&#xff0c;AI正在不断地拓展其应用领…

HTML+JavaScript-06

节点操作 目前对于节点操作还是有些困惑&#xff0c;只是了解简单的案例 具体操作可以看菜鸟教程&#xff1a;https://www.runoob.com/js/js-htmldom-elements.html 案例-1 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8…

考研高数(共轭根式)

1.定义 共轭根式&#xff1a;是指两个不等于零的根式A、B&#xff0c;若它们的积AB不含根式&#xff0c;则称A、B互为共轭根式。 共轭根式的一个显著特点是通过相乘能把根号去掉&#xff0c;这是很有帮助的 2.常用的共轭根式 3.例题 1&#xff09;求极限 2&#xff09;证明…

【超详细教程】2024最新Pytorch安装教程(同时讲解安装CPU和GPU版本)

目录 一、前言 二、pytorch简介 三、安装准备工作 3.1、下载Anaconda 四、判断是否有NVIDIA显卡 五、安装pytorch-CPU版本 六、安装pytorch-GPU版本 6.1、查看CUDA显卡驱动版本 6.2、安装CUDA 6.3、安装CuDNN&#xff08;加速器&#xff09; 6.4、安装pytorch-GPU 七…

从一个小故事讲解观察者模式~

定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 什么是观察者模式&#xff1f; 观察者模式在我们的日常生活中极其常见。 先来看看观察者模式的定义&#xff1a; 观察者模式定义了对象之间…

SV-7041T 多媒体教学广播IP网络有源音箱

SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到功率30W。同时它可以外接一个30W的无源副音箱&#xff0c;用在面积较大的场所。5寸进口全频低音喇…

OCP NVME SSD规范解读-8.SMART日志要求-3

SMART-11&#xff1a;这个属性记录的是用户数据区的NAND块最大擦写次数和最小擦写次数。其中&#xff0c;字节地址95:92表示最小用户数据擦写计数&#xff0c;而字节地址91:88表示最大用户数据擦写计数。这两个数值反映了闪存芯片在使用过程中的磨损程度&#xff0c;是评估SSD剩…

springboot集成 mysql快速入门demo

一、mysql环境搭建 采用docker-compose搭建&#xff0c;配置如下&#xff1a; docker-compose.yml version: 3 services:mysql:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/mysql:5.7 # 原镜像mysql:5.7container_name: mysql_3306 …

Github 2024-01-30 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-30统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4TypeScript项目2Jupyter Notebook项目2HTML项目1Rust项目1C项目1 稳定扩散Web UI 创建周期&…

使用企业微信一年要花费多少钱?

从今天开始&#xff0c;大力将为大家呈现一个新的话题——“企微问答”&#xff0c;大家有什么问题可以回复我们的公众号&#xff0c;如果你是严肃认真的提问&#xff0c;我们会严肃认真的给你一个答案。今日问题 &#xff1a;用企业微信一年要花多少钱 使用企业微信要花多少钱…

element-ui中的el-date-picker 页面至字显示不全的原因及解决

显示不全原因&#xff1a;.el-range-separator的宽度为5%,相对于外层的父元素不够 解决方案&#xff1a;加宽度 <style> .el-range-separator{width: 20px !important; } </style>解决图如下

基于单片机的烟草干燥温度控制系统设计

摘 要&#xff1a;烟草干燥研究一直备受国内外烟草工作者的重视&#xff0c;在烟草干燥的方法中热风管处理法是利用热空气对流使烟草达到干燥的效果&#xff0c;这样可以控制烟草干燥时的温度&#xff0c;使烟草能够更好更快地干燥&#xff0c;因此温度的检测和控制是很重要的。…

【开源】基于Qt5的ROS1/ROS2人机交互软件(支持地图编辑/多点导航)

本项目基于Qt5开发&#xff0c;基于CMake进行构建&#xff0c;可以实现一套代码同时在ROS1/ROS2系统中使用(本项目已接入CI,保证多ROS版本/系统版本可用性) 项目地址&#xff1a; https://github.com/chengyangkj/Ros_Qt5_Gui_App 软件在编译时会自动识别环境变量中的ROS1/ROS…

Log4j2-13-log4j2 asyncLogger 低延迟日志的异步日志记录器

log4j2 的 async logger Log4j2 是一个 Java 日志框架&#xff0c;它提供了灵活的配置和高性能的日志记录功能。其中&#xff0c;async logger 是 Log4j2 中的一个特性&#xff0c;它允许在日志记录时使用异步方式&#xff0c;以提高性能。 1. 异步日志简介 在传统的同步日志…

linux 下gdal库(python)

之前在windows下安装gdal&#xff0c;先要下安装包再安装。这次在linux上安装&#xff0c;试了一下pip install gdal&#xff0c;不可以。想着linux应该一样&#xff0c;结果一搜网上教程一堆&#xff0c;乱七八糟的。 搞了一个小时 最后发现一句话就可以&#xff01;&#xf…

路由备份聚合排错

目录 实验拓扑图 实验要求 实验排错 故障一 故障现象 故障分析 故障解决 故障二 故障现象 故障分析 故障解决 故障三 故障现象 故障分析 故障解决 故障四 故障现象 故障分析 故障解决 故障五 故障现象 故障分析 故障解决 实验拓扑图 实验要求 按照图示配…

我国个体工商户达1.24亿户,支撑近3亿人就业

官媒报道截至2023年底&#xff0c;全国登记在册个体工商户1.24亿户&#xff0c;占经营主体总量的67.4%&#xff0c;支撑近3亿人就业。 什么概念&#xff1f;我帮大家理解一下&#xff0c;2024年了&#xff0c;现在中国5个人里面就有一个人不用上班&#xff0c;而是自己当起了老…

【Cookie反爬虫】某采购网站动态Cookie加点选验证码校验分析与实战

文章目录 1. 写在前面2. 请求分析3. JS反混淆4. 深度分析 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋…