如何使用 React 和 React Hooks 创建一个天气应用

大家好,我是若川(点这里加我微信 ruochuan12,长期交流学习)。今天推荐一个练手的React项目,创建天气应用,相信很快能看完。昨天发送书掉粉18人,是我没想到的,送书一般是出版社按阅读量赞助几本,一般也会送一本给号主。感谢屏幕前的里一直关注着我。

点击下方卡片关注我、加个星标,或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列


React 是一个很棒的前端框架,可以用来构建用户界面。

使用 React 的优势之一是:我们创建的组件会被封装起来,换句话说,组件是不可见的。

在本文中,我们通过构建一个天气应用来学习 React。

如何安装 Node 和 npm

为了构建 React 应用,我们需要安装 Node 运行时环境,它主要是用来执行 JavaScript 代码。

在 https://nodejs.org/en/ 下载安装包。

还需要安装 npm,它是用 Node 构建的一个包管理器,可以在 JavaScript 应用中用它来安装依赖包。幸运的是,npm 包含在 Node 中,所以不必另外安装它。

安装完成后,打开终端(terminal)或命令提示符(command prompt),输入 node -v 命令,查看当前系统中的 Node 版本。

如何创建 React 应用

要创建 react 应用,可以在终端输入 npx create-react-app <Your app name> 命令(此例中命令为 npx create-react-app my-weather-app)。

可以看到相关依赖包正在自动安装。

依赖包安装完成之后,进入项目根目录(通过 cd 命令),执行 npm start 命令。

可以看到默认的 React 模板页面:

默认的 React 代码模板:

App.js

我们不需要这些,所以要清理一些无用代码。

app.js 中,删除 div 标签内的内容,删除导入 logo 的代码。

完成之后,页面内容会变成空白。

清理之后的 app.js

如何安装我们需要的依赖包

为了让这个应用更有吸引力,我们需要安装一些外部依赖包。

我们需要用到 Semantic React UI 库,执行以下命令来安装:

npm install semantic-ui-react semantic-ui-css

安装完成后,在 index.js 中引入这个库,将以下代码复制到 index.js 中即可:

import 'semantic-ui-css/semantic.min.css'

还需要安装 moment.js 来格式化时间,执行以下命令:

npm install moment --save

可以查看 package.json 文件来了解安装了哪些包:

package.json

在这里,可以看到目前安装的所有依赖包。

如何创建我们的天气应用

为了让我们的天气应用正常工作,需要使用 OpenWeatherMap 提供的 API 来获取天气信息。

访问 https://home.openweathermap.org/users/sign_up 页面,创建自己的账号。

完成之后,点击导航栏上的 API 选项,可以看到不同类型的天气数据,如当前天气、未来 4 天逐小时预报、未来 16 天预报等。这些就是用来获取天气信息的 API 端点。

调用这些 API 需要用到 API key,点击右上角的用户名,接着点击 “My API Keys”,可以查看自己的 API key。

如果没有的话就创建一个。

在项目根目录新建一个 .env 文件。

这是一个环境变量文件,保存所有 API 端点和 key 信息。

REACT_APP_API_URL = 'https://api.openweathermap.org/data/2.5'
REACT_APP_API_KEY = 【把你的 API key 粘贴在这里】
REACT_APP_ICON_URL = 'https://openweathermap.org/img/w'

把你的 API key 粘贴在 REACT_APP_API_KEY 变量中。

如何使用 React Hooks

React Hooks 让我们能够在函数组件中使用、管理 state。

我们会用到 useStateuseEffect 两个 hook,在顶部引入它们:

import React, { useEffect, useState } from "react";

创建两个 state,一个是纬度(lat),一个是经度(long)。

const [lat, setLat] = useState([]);
const [long, setLong] = useState([]);

创建一个 useEffect 函数,在应用加载及刷新时会执行它。

useEffect(() => {navigator.geolocation.getCurrentPosition(function(position) {setLat(position.coords.latitude);setLong(position.coords.longitude);});console.log("Latitude is:", lat)console.log("Longitude is:", long)}, [lat, long]);

使用 navigator.geolocation 获取纬度和经度,并使用 setLongsetLat 来设置纬度和经度 state。

import './App.css';
import React, { useEffect, useState } from "react";
export default function App() {const [lat, setLat] = useState([]);const [long, setLong] = useState([]);useEffect(() => {navigator.geolocation.getCurrentPosition(function(position) {setLat(position.coords.latitude);setLong(position.coords.longitude);});console.log("Latitude is:", lat)console.log("Longitude is:", long)}, [lat, long]);return (<div className="App"></div>);
}

app.js

现在 app.js 的内容如上。可以在浏览器控制台中查看纬度和经度的值:

Latitude is: 25.5922166
Longitude is: 85.12761069999999

纬度和经度值

如何利用纬度和经度来获取当前位置的天气

创建 getWeather 函数,基于我们的纬度和经度从 API 中获取天气数据。

这个函数中,使用 fetch 方法调用 API 获取天气数据。process.env.REACT_APP_API_URLprocess.env.REACT_APP_API_KEY 分别获取了 .env 文件中配置的 API 地址和 API key,lat 和 long 是之前获取到的纬度和经度。

接着将数据转换为 JSON 格式。

再接着,使用 setData 将结果存储在 data 对象中。

await fetch(`${process.env.REACT_APP_API_URL}/weather/?lat=${lat}&lon=${long}&units=metric&APPID=${process.env.REACT_APP_API_KEY}`).then(res => res.json()).then(result => {setData(result)console.log(result);});

然后把数据打印在控制台:

现在可以看到基于纬度和经度获取到的天气数据。

现在,app.js 文件的内容如下:

import './App.css';
import React, { useEffect, useState } from "react";
import Weather from './components/weather';
export default function App() {const [lat, setLat] = useState([]);const [long, setLong] = useState([]);const [data, setData] = useState([]);useEffect(() => {const fetchData = async () => {navigator.geolocation.getCurrentPosition(function(position) {setLat(position.coords.latitude);setLong(position.coords.longitude);});await fetch(`${process.env.REACT_APP_API_URL}/weather/?lat=${lat}&lon=${long}&units=metric&APPID=${process.env.REACT_APP_API_KEY}`).then(res => res.json()).then(result => {setData(result)console.log(result);});}fetchData();}, [lat,long])return (<div className="App"></div>);
}

app.js

如何创建天气组件

创建展示天气数据的组件。

在 src 文件夹中,创建 components 文件夹,并在其中创建 weather.js 文件。

app.js 中使用天气组件:

import './App.css';
import React, { useEffect, useState } from "react";
import Weather from './components/weather';
export default function App() {const [lat, setLat] = useState([]);const [long, setLong] = useState([]);const [data, setData] = useState([]);useEffect(() => {const fetchData = async () => {navigator.geolocation.getCurrentPosition(function(position) {setLat(position.coords.latitude);setLong(position.coords.longitude);});await fetch(`${process.env.REACT_APP_API_URL}/weather/?lat=${lat}&lon=${long}&units=metric&APPID=${process.env.REACT_APP_API_KEY}`).then(res => res.json()).then(result => {setData(result)console.log(result);});}fetchData();}, [lat,long])return (<div className="App">{(typeof data.main != 'undefined') ? (<Weather weatherData={data}/>): (<div></div>)}</div>);
}

在 app.js 文件中引入天气组件(Weather)

我在 return 语句加了一个判断,如果 data.main 的值为 undefined 则展示一个空的 div。因为 fetch 函数是异步的,所以必须加入这个检查。所有其他函数(除了异步的 fetch 函数)执行完毕之后,就会执行这个 return 语句,如果没有这个判断就会报错:

这是由于我们的应用在 API 调用完成之前渲染了 return 语句中返回的内容,而此时没有数据可以展示,所以抛出了 undefined 错误。

关于 async/await 的更多信息,可以查看这篇文章。

如何创建天气组件的主体部分

这个部分我们将会使用 Semantic UI 来设计界面。(译注:Semantic UI 使用了严格模式下已经弃用的 findDOMNode() 方法,会在控制台抛出警告,不必理会。)

创建展示天气信息的卡片:

import React from 'react';
import './styles.css';
import { Card } from 'semantic-ui-react'const CardExampleCard = ({weatherData}) => (<Card><Card.Content><Card.Header className="header">{weatherData.name}</Card.Header></Card.Content></Card>
)export default CardExampleCard;

Weather.js

我们引入了并使用了 semantic-ui-react 的 Card 组件,在卡片中还有一个 Header 用来展示当前城市。

现在问题是,怎么把 app.js 中的数据传给 weather.js 组件?

答案很简单,可以使用 props 从父组件向子组件传递数据。本例中,父组件是 app.js,子组件是 weather.js。

只要在 app.js 中使用 Weather 组件的地方加上 props 即可:

<Weather weatherData={data}/>

我们在这里通过名为 weatherData 的 props 传入数据,就可以在 weather.js. 中接收到。

import React from 'react';
import './styles.css';
import { Card } from 'semantic-ui-react'const CardExampleCard = ({weatherData}) => (<Card><Card.Content><Card.Header className="header">{weatherData.name}</Card.Header></Card.Content></Card>
)export default CardExampleCard;

可以看到,我们基于位置获取到了城市名。

同样的,我们可以为天气组件加入更多字段:

import React from 'react';
import './styles.css';
import { Card } from 'semantic-ui-react'const CardExampleCard = ({weatherData}) => (<Card><Card.Content><Card.Header className="header">City Name: {weatherData.name}</Card.Header><p>Temprature: {weatherData.main.temp}</p><p>Sunrise: {weatherData.sys.sunrise}</p><p>Sunset: {weatherData.sys.sunset}</p><p>Description: {weatherData.weather[0].description}</p></Card.Content></Card>
)export default CardExampleCard;

我们可以通过 API 获取温度、日出时间、日落时间以及描述信息。

可以任意添加其他字段,比如湿度、风速、能见度等。

如何格式化数据和日期

格式化数据,使其更易读。我们会增加一些字段。

首先,为温度加上单位,在温度后面加上 °C

并把日出日落时间转换为本地时间。

import React from 'react';
import './styles.css';
import { Card } from 'semantic-ui-react'const CardExampleCard = ({weatherData}) => (<Card><Card.Content><Card.Header className="header">City Name: {weatherData.name}</Card.Header><p>Temprature: {weatherData.main.temp} &deg;C</p><p>Sunrise: {new Date(weatherData.sys.sunrise * 1000).toLocaleTimeString('en-IN')}</p><p>Sunset: {new Date(weatherData.sys.sunset * 1000).toLocaleTimeString('en-IN')}</p><p>Description: {weatherData.weather[0].main}</p><p>Humidity: {weatherData.main.humidity} %</p></Card.Content></Card>
)export default CardExampleCard;

使用 moment.js. 计算出当天的礼拜日期和公历日期:

import moment from 'moment';<p>Day: {moment().format('dddd')}</p>
<p>Date: {moment().format('LL')}</p>

使用 moment.js

在顶部引入 moment 包,并分别展示当天的礼拜日期和公历日期。这个包的好处在于,它会自动更新公历日期和礼拜日期。

现在 weather.js 内容如下:

import React from 'react';
import './styles.css';
import { Card } from 'semantic-ui-react';
import moment from 'moment';const CardExampleCard = ({weatherData}) => (<Card><Card.Content><Card.Header className="header">City Name: {weatherData.name}</Card.Header><p>Temprature: {weatherData.main.temp} &deg;C</p><p>Sunrise: {new Date(weatherData.sys.sunrise * 1000).toLocaleTimeString('en-IN')}</p><p>Sunset: {new Date(weatherData.sys.sunset * 1000).toLocaleTimeString('en-IN')}</p><p>Description: {weatherData.weather[0].main}</p><p>Humidity: {weatherData.main.humidity} %</p><p>Day: {moment().format('dddd')}</p><p>Date: {moment().format('LL')}</p></Card.Content></Card>
)export default CardExampleCard;

weather.js

上图是现在的页面效果。

加上一些样式

现在已经得到了所有数据,我们加一些样式来让它更有吸引力。

首先,让卡片变大一点、改变 border-radius、加入更酷的字体和颜色、删除文本对齐(译注:文中 css 代码没有涉及文本对齐)。

import React from 'react';
import './styles.css';
import moment from 'moment';const CardExampleCard = ({weatherData}) => (<div className="main"><p className="header">{weatherData.name}</p><div><p className="day">Day: {moment().format('dddd')}</p></div><div><p className="temp">Temprature: {weatherData.main.temp} &deg;C</p></div></div>
)export default CardExampleCard;

weather.js

@import url('https://fonts.googleapis.com/css2?family=Recursive&display=swap');.main{width: 700px;border-radius: 15px;background-color: #01579b;
}.header{background-color: #424242;color: whitesmoke;padding: 10px;font-size: 28px;border-radius: 15px;font-family: 'Recursive', sans-serif;
}.day{padding: 15px;color: whitesmoke;font-family: 'Recursive', sans-serif;font-size: 24px;font-weight: 600;
}.temp{padding: 15px;color: whitesmoke;font-family: 'Recursive', sans-serif;font-size: 18px;
}

styles.css

现在我们的应用效果如上。

使用 flexbox 来排列数据:

<div className="flex"><p className="day">Day: {moment().format('dddd')}</p>
</div><div className="flex"><p className="temp">Temprature: {weatherData.main.temp} &deg;C</p>
</div>

给 div 元素加上“flex”类,并在 styles.css. 中加入以下样式:

.flex{display: flex;justify-content: space-between;
}

现在 weather.js 内容如下:

import React from 'react';
import './styles.css';
import moment from 'moment';const CardExampleCard = ({weatherData}) => (<div className="main"><p className="header">{weatherData.name}</p><div className="flex"><p className="day">Day: {moment().format('dddd')}</p><p className="day">{moment().format('LL')}</p></div><div className="flex"><p className="temp">Temprature: {weatherData.main.temp} &deg;C</p><p className="temp">Humidity: {weatherData.main.humidity} %</p></div></div>
)export default CardExampleCard;

同样的,加入剩下的字段:

import React from 'react';
import './styles.css';
import moment from 'moment';const WeatherCard = ({weatherData}) => (<div className="main"><p className="header">{weatherData.name}</p><div className="flex"><p className="day">{moment().format('dddd')}, <span>{moment().format('LL')}</span></p><p className="description">{weatherData.weather[0].main}</p></div><div className="flex"><p className="temp">Temprature: {weatherData.main.temp} &deg;C</p><p className="temp">Humidity: {weatherData.main.humidity} %</p></div><div className="flex"><p className="sunrise-sunset">Sunrise: {new Date(weatherData.sys.sunrise * 1000).toLocaleTimeString('en-IN')}</p><p className="sunrise-sunset">Sunset: {new Date(weatherData.sys.sunset * 1000).toLocaleTimeString('en-IN')}</p></div></div>
)export default WeatherCard;

weather.js

@import url('https://fonts.googleapis.com/css2?family=Recursive&display=swap');.main{width: 700px;border-radius: 20px;background-color: #01579b;
}.top{height: 60px;background-color: #424242;color: whitesmoke;padding: 10px;border-radius: 20px 20px 0 0;font-family: 'Recursive', sans-serif;display: flex;justify-content: space-between;
}.header{background-color: #424242;color: whitesmoke;margin: 10px 0px 0px 10px;font-size: 25px;border-radius: 20px 20px 0 0;font-family: 'Recursive', sans-serif;
}.day{padding: 15px;color: whitesmoke;font-family: 'Recursive', sans-serif;font-size: 24px;font-weight: 600;
}.temp{padding: 15px;color: whitesmoke;font-family: 'Recursive', sans-serif;font-size: 18px;
}.flex{display: flex;justify-content: space-between;
}.sunrise-sunset{padding: 15px;color: whitesmoke;font-family: 'Recursive', sans-serif;font-size: 16px;
}.description{padding: 15px;color: whitesmoke;font-family: 'Recursive', sans-serif;font-size: 24px;font-weight: 600;
}

styles.css

现在我们的应用效果如下:

如何加入刷新按钮

在页面顶部增加一个刷新按钮:

import React from 'react';
import './styles.css';
import moment from 'moment';
import { Button } from 'semantic-ui-react';const refresh = () => {window.location.reload();
}const WeatherCard = ({weatherData}) => (<div className="main"><div className="top"><p className="header">{weatherData.name}</p><Button className="button" inverted color='blue' circular icon='refresh' onClick={refresh} /></div><div className="flex"><p className="day">{moment().format('dddd')}, <span>{moment().format('LL')}</span></p><p className="description">{weatherData.weather[0].main}</p></div><div className="flex"><p className="temp">Temprature: {weatherData.main.temp} &deg;C</p><p className="temp">Humidity: {weatherData.main.humidity} %</p></div><div className="flex"><p className="sunrise-sunset">Sunrise: {new Date(weatherData.sys.sunrise * 1000).toLocaleTimeString('en-IN')}</p><p className="sunrise-sunset">Sunset: {new Date(weatherData.sys.sunset * 1000).toLocaleTimeString('en-IN')}</p></div></div>
)export default WeatherCard;

weather.js

.button{width: 35px;height: 35px;
}

styles.css

可以看到,页面上多了一个刷新按钮,点击它就会触发 refresh 函数、刷新页面。

如何加入页面加载动画

加入加载动画,增强应用的用户体验。

引入 Semantic UI 的 Loader 组件,并在数据尚未加载完成的情况下显示:

import { Dimmer, Loader } from 'semantic-ui-react';<div className="App">{(typeof data.main != 'undefined') ? (<Weather weatherData={data}/>): (<div><Dimmer active><Loader>Loading..</Loader></Dimmer></div>)}</div>

app.js

回顾一下

我们创建了一个基于地理位置展示当前天气信息的 React 应用。

一起回顾一下我们所做的东西。

我们学习了 State 和 Props

State 和 Props 是 React 提供的非常强大的特性,可以用来管理数据、控制不同组件之间的数据流。

在我们的应用中,使用 State 管理应用程序的状态,比如城市名称、温度、日期、湿度等。这些数据因人而异,取决于用户所处的位置。

另一方面,使用 Props 在不同组件之间传递数据。我们在 app.js 中获取天气数据,又在 weather.js 中读取这些数据。记住,使用 props 只能从父组件向子组件传递数据。

我们使用了 React Hooks

如果使用过类组件(class component),那么你肯定了解生命周期方法(life-cycle methods)。如果没用过的话,可以把它们理解为一些在页面渲染或重新渲染是执行的方法。但是我们不能在函数组件(functional component)中使用生命周期方法,因为它们是专门为类组件设计的。

所以,使用 React Hooks 来替代。在我们的应用中用到了两个 hook,一个是用来管理应用 state 的 useState,另一个是用来在页面渲染或加载时执行一些任务的 useEffect。

我们尝试了 Semantic UI

Semantic UI 是为 React 设计的库,它提供了许多出色的组件。

朋友们,以上就是本文的全部内容了。你可以试着为这个应用添加更多特性,比如未来 5 天预报、图标说明等。

想要进一步了解的话,可以查看项目代码。

不断尝试,快乐学习!


原文链接:https://www.freecodecamp.org/news/learn-react-by-building-a-weather-app/

作者:Nishant Kumar

译者:Humilitas


最近组建了一个江西人的前端交流群,如果你也是江西人可以加我微信 ruochuan12 拉你进群。


················· 若川出品 ·················

今日话题

今天群里有小伙伴以为我是全职运营公众号了,我说那不得饿死,我的本职工作和大家一样是公司写代码呀,业余时间运营的公众号,目前公众号有些收入,有了收入也会给大家送送书和一些福利。收入来源主要来自平时接的优质广告推文,如果你刚好感兴趣可以报名领取学习等,这是对我最大的支持,不感兴趣划走不看即可。欢迎分享、收藏、点赞、在看我的公众号文章~

一个愿景是帮助5年内前端人走向前列的公众号

可加我个人微信 ruochuan12,长期交流学习

推荐阅读

我在阿里招前端,我该怎么帮你?(现在还能加我进模拟面试群)

若川知乎问答:2年前端经验,做的项目没什么技术含量,怎么办?

点击方卡片关注我、加个星标,或者查看源码等系列文章。
学习源码整体架构系列、年度总结、JS基础系列

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

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

相关文章

拟态防御_纯素食汉堡的拟态

拟态防御If people are so against the idea of pigs and chickens being chopped up why would they want to buy fake bacon with realistic visual streaks of pork fat, or soy meat that tries to replicate the streaky texture of cooked chicken flesh? Surely these …

delphi 算术溢出解决方法_性能优化系列:JVM 内存划分总结与内存溢出异常详解分析...

前言那些使用过 C 或者 C 的读者一定会发现这两门语言的内存管理机制与 Java 的不同。在使用 C 或者 C 编程时&#xff0c;程序员需要手动的去管理和维护内存&#xff0c;就是说需要手动的清除那些不需要的对象&#xff0c;否则就会出现内存泄漏与内存溢出的问题。如果你使用 J…

微信小程序如何发送 http 请求

2019独角兽企业重金招聘Python工程师标准>>> 为什么要使用云函数发送 http 请求小程序云函数5 个可信域名不受限制需要备案无需备案在一些特殊情境, 比如域名没有备案或域名 5 个以上就需要使用云函数发送 HTTP 请求了. 如何使用云函数发送 HTTP 请求? 在云函数中能…

H5 页面列表缓存方案

大家好&#xff0c;我是若川&#xff08;点这里加我微信 ruochuan12&#xff0c;长期交流学习&#xff09;。今天给大家介绍一下关于h5页面的列表缓存方案。感谢屏幕前的你一直关注着我。点击下方卡片关注我、加个星标&#xff0c;或者查看源码等系列文章。学习源码整体架构系列…

不只是coding_不只是外表

不只是coding“We just need it to look more professional…”“我们只需要看起来更专业...” “We don’t have the graphic expertise you do…”“我们没有您所需要的图形专业知识……” “I just don’t know how to make it look good…”“我只是不知道如何使它看起来…

读取 wps_软件前世今生篇之WPS(求伯君1988年先于OFFICE研发出WPS)

软件前世今生篇之WPS今天给大家普及一下WPS这款办公软件&#xff0c;相信你会问wps有什么可普及的&#xff1f;我们都知道啊&#xff0c;不就是一款办公软件&#xff0c;而且还是抄袭office的&#xff0c;安装还挺简单的&#xff0c;而且还有一大堆广告&#xff0c;不过使用免费…

吴恩达机器学习笔记11-梯度下降法实践2-学习率

梯度下降算法收敛所需要的迭代次数根据模型的不同而不同&#xff0c;我们不能提前预知&#xff0c;我们可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。 也有一些自动测试是否收敛的方法&#xff0c;例如将代价函数的变化值与某个阀值&#xff08;例如0.001&#…

制作五彩纸屑转场动效_何时以及如何将五彩纸屑添加到产品UI

制作五彩纸屑转场动效As I am sure all designers have picked up on, confetti has become a popular method of (positive) feedback inside mobile and desktop apps. I will discuss the viable scenarios where you can implement confetti and will even provide some co…

【无套路送书】架构师是怎样炼成的?

大家好&#xff0c;我是若川。不知道这是今年第几次送书了&#xff0c;前三次分别是&#xff1a;第一次&#xff0c;第二次&#xff0c;第三次。本次《架构师的自我修炼》&#xff0c;非常珍贵&#xff0c;我争取到了2本送给大家&#xff0c;送书规则见文末。可以参与下&#x…

WinForm中使用Excel控件

&#xfeff;最近项目中要在WinForm中使用Excel控件&#xff0c;经过几天的研究&#xff0c;现在总结一下成果。 在WinForm中使用Excel控件主要有三种方法&#xff1a;WebBrowser、DSOFramer、OWC。下面分别描述一下如何使用。 一、WebBrowser /// -1、如何使用 WebBrowser 控件…

NASA公布“门户计划”,在月球轨道建立空间站进一步探索月球

门户是NASA研发一种小型的宇宙飞船的名字&#xff0c;该宇宙飞船将围绕月球轨道运行 成为宇航员临时住所和办公室。 日前&#xff0c;美国宇航局&#xff08;以下简称“NASA”&#xff09;公布了“门户计划”&#xff0c;该计划具体是指在月球轨道上建立空间站&#xff0c;以帮…

浅析Page.LoadTemplate(模板)方法动态获取绑定模板后,通过FindControl获取服务端控件的方法。...

平常使用DataList数据控件绑定数据时&#xff0c;都是在ItemTemplate项里面放入 <asp:DataList ID"list2"runat"server"><ItemTemplate><asp:HyperLink ID"hl"runat"server"></asp:HyperLink></ItemTempl…

苹果5s变砖_苹果砖的故事以及可以改进的地方

苹果5s变砖Even since I can remember I’ve always been curious about trying out all kinds of software, checking out different operating systems, and improving my own user experience through customizing them. Over the years I’ve had the opportunity to test …

学习 launch-editor 源码整体架构,探究 vue-devtools「在编辑器中打开组件」功能实现原理...

1. 前言你好&#xff0c;我是若川[1]&#xff0c;微信搜索「若川视野」关注我&#xff0c;专注前端技术分享&#xff0c;一个愿景是帮助5年内前端开阔视野走向前列的公众号。欢迎加我微信ruochuan12&#xff0c;长期交流学习。这是学习源码整体架构系列 之 launch-editor 源码&…

:传递给 left 或 substring 函数的长度参数无效。_Java函数式编码结构-好程序员

好程序员Java培训分享Java函数式编码结构&#xff0c;本文将探讨三种下一代JVM语言&#xff1a;Groovy、Scala和Clojure&#xff0c;比较并对比新的功能和范例&#xff0c;让Java开发人员对自己近期的未来发展有大体的认识&#xff0c;下面我们一起来看一下吧。当垃圾回收成为主…

跨库一致性_设计跨平台的一致性

跨库一致性I offended an Apple employee the other day when I was checking out the new iPad Pro and I told him that I was an Android phone user. Eyes rolled, jokes were made, and we agreed to disagree.前几天&#xff0c;我在检阅新iPad Pro时冒犯了一名苹果员工&…

漫画 | 一个NB互联网项目的上线过程…

大家好&#xff0c;我是若川&#xff08;点这里加我微信 ruochuan12&#xff0c;长期交流学习&#xff09;。今天虽然是周六&#xff0c;但还是要上班&#xff0c;所以就推荐一篇比较轻松的漫画。点击下方卡片关注我、加个星标&#xff0c;或者查看源码等系列文章。学习源码整体…

胖子脸:库珀·布莱克100年

In 16th century Europe, roman typefaces were the first to surpass blackletter as the preferred choice for expressing emphasis in print. True bold weight roman letters didn’t appear until the 19th century, which critics quickly coined “Fat Faces” due to …

C语言中的布尔值

C语言的布尔类型在C语言标准(C89)没有定义布尔类型&#xff0c;所以C语言判断真假时以0为假&#xff0c;非0为真。所以我们通常使用逻辑变量的做法&#xff1a; //定义一个int类型变量&#xff0c;当变量值为0时表示false&#xff0c;值为1时表示trueint flag;flag 0;//......…

c++ explicit关键字_聊一聊 C++的特性 explicit 匿名空间

聊一聊 C的特性 explicit && 匿名空间explicit关键字首先看一下explicit的作用&#xff1a;explicit 是避免构造函数的参数自动转换为类对象的标识符&#xff0c;平时代码中并不是经常用到&#xff0c;但是&#xff0c;有时候就是因为这个&#xff0c;会造成一定的BUG出…