IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 特效开发(bootstrap react) -> 正文阅读

[JavaScript知识库]特效开发(bootstrap react)

# bootstrap简介与安装

官网:<https://getbootstrap.com/>

`bootstrap` 的 `github` 地址:<https://github.com/twbs/bootstrap>

`bootstrap` 是一个用于制作页面界面的框架

框架: 提供一个标准和规范,再由开发人员自行填充内容

## 安装

点击页面中的 download 按钮:<https://getbootstrap.com/docs/5.0/getting-started/download/>

或者在 `github` 中下载 `bootstrap` 源代码,源代码中的 `dist` 文件夹就是我们要用的文件

`npm` 安装

```shell

npm i bootstrap

- [布局](#布局)

? - [响应式布局](#响应式布局)

? - [断点](#断点)

? - [布局容器](#布局容器)

? - [网格布局](#网格布局)

# 布局

## 响应式布局

响应式布局就是根据屏幕宽度,切换不同页面布局的一种布局方式,这里可以查看 bootstrap 官网在不同屏幕宽度下的表现

bootstrap 是使用断点来完成响应式布局的

## 断点

断点是 bootstrap 面向不同屏幕宽度,预制好的媒体查询

通常的讲,断点,代表的就是不同的屏幕宽度

bootstrap 中如何体现断点,在class中,添加不同断点的名称,可以采用不同断点的样式

# 布局容器

通常是页面的根节点,使用 `class="container"` 来设置布局容器

布局容器受断点影响,可以设置不同断点上的容器,具体可查表:

<https://getbootstrap.com/docs/5.0/layout/containers/>

## 网格布局

将内容进行行列分布的布局方式就叫网格布局

bootstrap中网格布局的灵魂样式就是 行:`row`,列:`col`

display显示方式

?<!-- 参考:https://getbootstrap.com/docs/5.2/utilities/display/ -->

? ? <!-- 语法:

? ? ? ? 在 xs 断点下: d-{value}

? ? ? ? xs 以上: d-{breakpoints}-{value}

? ? -->

? ? <!-- 当屏幕宽度小于 sm 时显示 -->

? ? <div class="container d-block d-sm-none">小于 sm</div>

? ? <!-- 当屏幕宽度为 md 时 显示 -->

? ? <div class="container d-none d-sm-block d-md-none">md</div>

? ? <!-- 当屏幕宽度大于 lg 时 显示 -->

? ? <div class="container d-none d-md-block">大于 lg</div>

?原声表单验证

<!--

? ? // 参考:https://developer.mozilla.org/zh-CN/docs/Learn/Forms/Form_validation

? ? 知识点

? ? 学会使用html自带的表单验证

? ? input 的验证属性

? ? ? ? required

? ? ? ? pattern

? ? ? ? minlength maxlength

? ? ? ? min max

? ? ? ? type

? ? novalidate 屏蔽html自带的验证报告

? ? input 的 validity 属性

? ? ? ? validity.valueMissing

? ? ? ? validity.patternMismatch

? ? ? ? validity.rangeOverflow

? ? ? ? validity.rangeUnderflow

? ? ? ? validity.tooLong

? ? ? ? validity.tooShort

? ? ? ? validity.valid

? ? 自定义提示信息

? ? ? ? input.setCustomValidity

? ? form 或 input 的 checkValidity

? ? 显示验证报告

? ? ? ? form.reportValidity()

? ? 表单验证总结步骤

? ? ? ? 1. 给表单添加 novalidate 屏蔽自动验证报告

? ? ? ? 2. 对每个元素的 validity 属性进行验证

? ? ? ? 3. 根据每个元素的验证结果设置自定义异常 setCustomValidity

? ? ? ? 4. 提交验证报告

? ? ? ? 5. 根据验证结果执行后续网络操作

# 其他组件和工具类

除了布局和表单元素等基础功能外,`bootstrap` 还提供了一系列的开箱即用的功能

例如组件(`Component`)和工具类(`Utilities` 和 `Helper`),这些东西需要开发者在需要时,按需引入

<https://getbootstrap.com/docs/5.1/components/accordion/>

其中,部分组件包含动画,若要使用带动画的组件,请引入 `bootstrap.js` 文件,并参考文档中的 `via JavaScript` 部分进行函数调用

# 媒体文件和图片懒加载(lazy-loading)

什么是懒加载?

懒加载就是页面中看不到时,就不去加载它,当页面中出现该内容时再去加载

懒加载多用于图片和媒体文件

好处:

好处在于用户看不见的东西就不用使用浏览器去下载了

还可以让页面加载更快

? ? // 总结

? ? // 1. 给需要懒加载的元素添加 data-src

? ? // 2. 给滚动元素添加 scroll 事件监听器

? ? // 3. 计算显示图片的临界值 scrollTop = 内容高 - 图片高 - 窗口高

? ? // 4. 判断容器元素的 scrollTop 大于临界值 加载 data-src

react

# react 简介

中文官网:<https://zh-hans.reactjs.org/>

`react` 是一个 **js核心库**,如同 `jquery` 一样,具有大量 `react` 生态(围绕 `react` 核心开发的库)

特点:

- 声明式

? - 也就是js中的数据决定页面最终渲染的结果

? - 声明式不是响应式,但往往都是同时出现共同作用页面

? ? - 响应式:数据变化页面会立即更新

- 组件化

? - 一个包含所有外观和行为的,独立可运行的模块,称为组件

? - 组件化的思想可以将复杂页面,化繁为简的进行设计

? - 组件可提高代码复用性

- 一次学习,跨平台编写

? - 使用 `react` 可以开发 桌面web页面,移动端页面,移动app,桌面app等

# jsx 语法

jsx 语法保留了js的所有特性,在此基础上扩展了 react 的元素声明语法,例如:

```jsx

// 声明一个 react-dom

const element = <h1>Hello World</h1>

若 react-dom 标签有多行,可以用圆括号包裹

```jsx

const element = (

? ? <h1>

? ? ? ? Hello World

? ? </h1>

)

每一给 react-dom 只能有一个根节点

```jsx

const element = (

? ? <h1>

? ? ? ? Hello World

? ? </h1>

? ? // h1 和 h2 都是根节点 这个写法是错误的

? ? <h2>

? ? ? ? 222

? ? </h2>

)

## 插值

将变量插入到元素中,使用大括号 `{}`

```jsx

const msg = 'hello world !!!'

const element = <h1>{msg}</h1>

花括号内的插值部分可以写入任何有效的 js 表达式

## 插入html属性

直接使用引号或花括号插入表达式,如:

```jsx

const styleObj = {backgroundColor: "green"}

// 需要注意的是 style 属性必须用花括号来插入值

// 不是所有的html属性名都是原始名称,例如 class 应该写为 className 并采用驼峰式命名方法 而不是html的短横线 因为本质上这里的标签是js代码

const element = (

? ? <h1

? ? ? ? style={styleObj}

? ? ? ? className="content">

? ? ? ? Hello World

? ? </h1>

)

```

## 使用函数创建对象

```jsx

// 可以使用函数创建 react-dom 对象

const element = React.createElement(

? 'h1',

? {className: 'greeting'},

? 'Hello, world!'

);

// 等价于

const element = (

? <h1 className="greeting">

? ? Hello, world!

? </h1>

);

```

> 注意:jsx 中的 react-dom 内容,本质上会被 babel 翻译成 React.createElement 函数

? ? ?什么是组件

? 组件具备以下特点

? ? ? ? ?1. 独立显示的页面内容

? ? ?2. 独立维护的组件状态

?? ??3. 组件被当作标签使用

? ? // ? ? ?所以,组件是一个具备独立显示内容,独立维护状态,被当作标签使用的可复用模组

? ? // 应用场景

? ? // ? ? ?可复用的页面内容,就可以考虑封装成组件

? ? // 声明组件

? ? // ? ? ?类组件

? ? // ? ? ? ? ?render函数

? ? // ? ? ? ? ?构造函数和props

? ? // ? ? ? ? ?props.children

? ? // ? ? ?函数组件

? ? // ? ? ? ? ?参数props

? ? // ? ? ? ? ?函数组件没有this

? ? // react 中声明组件有两种方法

? ? // 一种叫 类组件 另一种叫 函数组件

? ? // 两种组件对于 react 来说是等价的

? ? // 声明类组件

? ? // 需要继承 React.Component

? ? class AComponent extends React.Component {

? ? ? ? // 可以有组件的属性

? ? ? ? label = 'h'

? ? ? ? // 构造函数中包含props参数

? ? ? ? // props 代表组件的 html 属性

? ? ? ? // props 是只读属性

? ? ? ? constructor(props) {

? ? ? ? ? ? // 由于存在父类 React.Component

? ? ? ? ? ? // 所以构造函数中应先调用super

? ? ? ? ? ? super(props)

? ? ? ? ? ? // render 函数中可以使用 this.props 访问此处的 props

? ? ? ? ? ? console.log(props)

? ? ? ? ? ? // 可以使用 props.children 代表组件标签体里的内容

? ? ? ? ? ? console.log(props.children)

? ? ? ? }

? ? ? ? // 可以有组件方法

? ? ? ? getTime() {

? ? ? ? ? ? return new Date()

? ? ? ? }

? ? ? ? // 类组件中必须包含 render 方法

? ? ? ? render() {

? ? ? ? ? ? // render 方法必须返回一个 react-dom 对象

? ? ? ? ? ? // 返回的 react-dom 对象用于描述组件长什么样子的

? ? ? ? ? ? return (

? ? ? ? ? ? ? ? <div>

? ? ? ? ? ? ? ? ? ? {/* 组件中可以调用自己的属性和方法 */}

? ? ? ? ? ? ? ? ? ? {this.label}: {this.getTime().getHours()}; m: {this.getTime().getMinutes()};

? ? ? ? ? ? ? ? ? ? s: {this.getTime().getSeconds()}

? ? ? ? ? ? ? ? ? ? <br/>

? ? ? ? ? ? ? ? ? ? {/* 标签体的内容可以插值到 render 中 */}

? ? ? ? ? ? ? ? ? ? {this.props.children}

? ? ? ? ? ? ? ? </div>

? ? ? ? ? ? )

? ? ? ? }

? ? }

? ? // 函数组件

? ? // 参数props就是标签的html属性

? ? // props 中也包含 children

? ? function BComponent(props) {

? ? ? ? // 此处的this为 undefined

? ? ? ? // 之所以为 undefined 是因为函数组件没有实例对象

? ? ? ? console.log(this)

? ? ? ? console.log(props)

? ? ? ? // 可以在组件内声明其他函数和变量

? ? ? ? let count = 0

? ? ? ? function getCount() {

? ? ? ? ? ? return count

? ? ? ? }

? ? ? ? // 函数组件必须返回一个react-dom对象

? ? ? ? return (

? ? ? ? ? ? <div>

? ? ? ? ? ? ? ? <div>我是一个函数组件</div>

? ? ? ? ? ? ? ? <div>{count}: {getCount()}</div>

? ? ? ? ? ? ? ? <div>{props.children}</div>

? ? ? ? ? ? </div>

? ? ? ? )

? ? }

? ? ReactDOM.createRoot(document.querySelector('#root')).render((

? ? ? ? <div>

? ? ? ? ? ? {/* 组件被当作标签使用 */}

? ? ? ? ? ? {/* 可以使用插值给属性赋值 这样赋值的属性就可以不是字符串 */}

? ? ? ? ? ? <AComponent name="张三" age={16} isShow={false}>

? ? ? ? ? ? ? ? <div>hello</div>

? ? ? ? ? ? ? ? <div>world</div>

? ? ? ? ? ? </AComponent>

? ? ? ? ? ? <AComponent></AComponent>

? ? ? ? ? ? <BComponent name="张三" age={16} isShow={false}>

? ? ? ? ? ? ? ? <h1>这是BComponent的标签体</h1>

? ? ? ? ? ? ? ? <div>hello</div>

? ? ? ? ? ? ? ? <div>world</div>

? ? ? ? ? ? </BComponent>

? ? ? ? </div>

? ? ))

? ? 什么是组件状态?

? ? // ? ? ?在计算开发领域 怎么理解状态(state)这个英文?

? ? // ? ? ?假设我们制作一个时钟,时钟每秒钟的时间值都不一样

? ? // ? ? ?那么我们将描述某个 “时刻” 的时钟的 “数据” 称为该时钟在那个 “时刻” 的 “状态” (state)

? ? // ? ? ?所以 state 一词,通常指某个时刻用于描述某个对象的数据模型

? ? // ? ? ?因此 有时会听到上一个状态 下一个状态的说法 这指的就是不同时刻 描述同一个对象的数据模型

? ? // 声明状态

? ? // 组件的状态更新 this.setState 的使用

? ? // ? ? ?1. 不要直接修改 state 要通过 setState 修改

? ? // ? ? ?2. setState 的参数不要直接依赖 this.state 或 this.props;应使用 this.setState((state, props)=>{return {}}) 代替

? ? // ? ? ?3. setState 方法是异步的 可以通过 setState 的第二个回调函数 来执行赋值成功后的代码

? ? // ? ? ?4. setState 最终会修改 this.state

? ? ?什么是生命周期

? ? // ? ? ?当我们以面向对象的思想看待组件时,可以将组件看成一个人

? ? // ? ? ?那么人就有生老病死的过程,那么组件的生老病死的过程是通过组件的方法来体现的

? ? // ? ? ?这些体现生命过程的方法,就称为生命周期

? ? // ? ? ?总结:

? ? // ? ? ?人->生老病死

? ? // ? ? ?代码->用函数来描述对象的生老病死

? ? // 生命周期有哪些阶段

? ? // ? ? ?挂载

? ? // ? ? ? ? ?constructor()

? ? // ? ? ? ? ?static getDerivedStateFromProps() // https://zh-hans.reactjs.org/docs/react-component.html#static-getderivedstatefromprops

? ? // ? ? ? ? ?render()

? ? // ? ? ? ? ?componentDidMount()

? ? // ? ? ?更新

? ? // ? ? ? ? ?static getDerivedStateFromProps(props, state)=>{[key: string]: any} 每次调用渲染函数render前调用,返回值是希望改变的状态对象

? ? // ? ? ? ? ?shouldComponentUpdate(props, state)=>boolean 判断是否应该更新,返回一个布尔值

? ? // ? ? ? ? ?render()

? ? // ? ? ? ? ?getSnapshotBeforeUpdate(prevProps, prevState)=>{[key: string]: any} 每次更新前调用,返回值将被传递给 componentDidUpdate 充当第三个参数

? ? // ? ? ? ? ?componentDidUpdate(prevProps, prevState, snapshot)

? ? // ? ? ?卸载

? ? // ? ? ? ? ?componentWillUnmount()

? ? // ? ? ?异常捕获

? ? // ? ? ? ? ?static getDerivedStateFromError()

? ? // ? ? ? ? ?componentDidCatch()

? ? // 应用场景

? ? // ? ? ?其中 挂载和卸载的 生命周期用得比较多

? ? // ? ? ?constructor() 常用于初始化组件,拉取远程数据

? ? // ? ? ?componentDidMount() 用于页面第一次渲染完成后,查询页面元素

? ? // ? ? ?componentWillUnmount() 卸载组件时对事件的解绑等需要处理的事

? ? // 卸载组件

? ? // ? ? ?root.unmount()

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:43:36  更:2022-09-30 00:48:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 20:16:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码