【开发】前端工程——ReactJS

2023-11-16

前置知识:JavaScript&ES6

ReactJS

前端开发的四个阶段

1. 静态页面阶段

在第一个阶段中前端页面都是静态的,所有前端代码和前端数据都是后端生成的,前端纯粹只是增加一些特殊效果。

后端MVC模式

  • Model(模型层):提供/保持数据
  • Controller(控制层):数据处理,实现业务逻辑
  • View(视图层):展示数据,提供用户界面

此时的前端只是后端MVC中的V

2. ajax阶段

2004年AJAX诞生,改变了前端开发。Gmail和Google地图这样革命性产品出现,使前端的作用不再是展示页面,还可以管理数据并与用户互动

3. 前端MV阶段

把MVC模式照搬到了前端,只有 M(读写数据)和V(展示数据),没有C(处理数据)

有些框架提出 MVVM模式,用View Model代替Controller。Model拿到数据后,View Model将数据处理成视图层(View)需要的格式

4. SPA阶段

前端可以做到读写数据,切换视图,用户交互。网页其实是一个应用程序,而不是信息的纯展示。这种单张网页的应用程序称为SPA(Single Page Application)

2010年后,前端工程师从开发页面(切模板),逐渐变成了开发“前端应用”,跑在浏览器里面的应用

目前,流行的前端框架 Vue,React都属于SPA开发框架

ReactJS

简介

在这里插入图片描述

官网

用于构建用户界面的JavaScript框架,由Facebook开发

ReactJS把复杂的页面,拆分成一个个的组件,将这些组件拼装起来,就会呈现一个页面

ReactJS可用于MVC、MVVM等架构

HelloWorld

1. 新建static web项目

在这里插入图片描述

2. 初始化项目,添加umi依赖

tyarn init -y

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

tyarn add umi --dev

3. 编写HelloWorld程序

在工程的根目录下新建config/config.js

在UmiJS的约定中,config/config.js将作为UmiJS的全局配置文件

在这里插入图片描述

在Umi中,约定的目录结构如下:

.
    ├── dist/                          // 默认的 build 输出目录
    ├── mock/                          // mock 文件所在目录,基于 express
    ├── config/
        ├── config.js                  // umi 配置,同 .umirc.js,二选一
    └── src/                           // 源码目录,可选
        ├── layouts/index.js           // 全局布局
        ├── pages/                     // 页面目录,里面的文件即路由
            ├── .umi/                  // dev 临时目录,需添加到 .gitignore
            ├── .umi-production/       // build 临时目录,会自动删除
            ├── document.ejs           // HTML 模板
            ├── 404.js                 // 404 页面
            ├── page1.js               // 页面 1,任意命名,导出 react 组件
            ├── page1.test.js          // 用例文件,umi test 会匹配所有 .test.js 和 .e2e.js 结尾的文件
            └── page2.js               // 页面 2,任意命名
        ├── global.css                 // 约定的全局样式文件,自动引入,也可以用 global.less
        ├── global.js                  // 可以在这里加入 polyfill
        ├── app.js                     // 运行时配置文件
    ├── .umirc.js                      // umi 配置,同 config/config.js,二选一
    ├── .env                           // 环境变量
    └── package.json

在config.js文件中输入,以便后面使用:

//导出一个对象,暂时设置为空对象,后面再填充内容
export default{};
创建HelloWorld.js页面文件

在Umi中,约定存放页面代码的文件夹在 src/pages ,可以通过 singular:false来设置单数的命名方式

在这里插入图片描述

在HelloWorld.js中输入如下内容:

export default () => {
	return <div>hello world</div>;
}
构建和部署

我们写的js,必须通过umi先转码后才能正常执行。

umi build

在这里插入图片描述

在这里插入图片描述

启动服务,查看页面效果
# 启动服务
umi dev

可以看到,通过 /HelloWorld 即可访问到刚写的HelloWorld.js文件

在umi中,可以使用约定式的路由,将在pages下的JS文件都会按照文件名映射到一个路由

在这里插入图片描述

添加 umi-plugin-react 插件

umi-plugin-react插件是umi官方基于react封装的插件

链接

#添加插件
tyarn add @umijs/preset-react --dev

在这里插入图片描述

在config.js中引入该插件

export default{
    dva: {},
    antd: {}
};

JSX语法

JSX语法就是,可以在js文件中插入html片段,是React自创的一种语法

JSX语法会被Babel等转码工具进行转码,得到正常的js代码再执行

注意

  1. 所有的html标签必须是闭合的

  2. 在JSX语法中,只能有一个根标签,不能有多个

    const div1 = <div><div>hello</div> <div>world</div></div>//正确
    const div2 = <div>hello</div> <div>world</div> //错误
    
  3. 在JSX语法中,如果想要在html标签中插入js脚本,需要通过 {} 插入js脚本

    export default()=>{
        const fun = () =>"黑马程序"
    
        return (
            <div><div>{fun()}</div> <div>hello world</div></div>
        );
    }
    

组件

1. 自定义组件

import React from "react";
//1. 导入React

class HelloWorld extends React.Component{
//2. 继承React.Component
    render(){//3. 重写render()方法,用于渲染页面
        return <div>Hello World</div>
    }
}

//4. 导出该类
export default HelloWorld;

2. 导入自定义组件

import React from "react";
import HelloWorld from "./HelloWorld";

class Show extends React.Component{
    render() {
        return (
            <div>
                <HelloWorld></HelloWorld>
            </div>
        );
    }
}

export default Show;

组件参数

import React from "react";
//1. 导入React

class HelloWorld extends React.Component{
//2. 继承React.Component
    render(){//3. 重写render()方法,用于渲染页面
        return (
            <div>
                <div>Hello World</div>
                <div>lastName={this.props.lastName}</div>
                <div>{this.props.children}</div>
            </div>
        );
    }
}

//4. 导出该类
export default HelloWorld;
import React from "react";
import HelloWorld from "./HelloWorld";

class Show extends React.Component{
    render() {
        return (
            <div>
                <HelloWorld lastName={"Auspice"}>Tian</HelloWorld>
            </div>
        );
    }
}

export default Show;

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

组件的状态

每一个 页面组件 都有一个状态,其保存在 this.state 中,当状态值发生变化时,React框架会自动调用 render() 方法,重新渲染画面

注意

  • this.state值的设置要在构造参数中完成,不能直接对 this.state 修改
  • 要修改this.state的值,需要调用 this.setState() 完成

案例:用过点击按钮,不断更新this.state,从而反映到页面

import React from "react";

class Test extends React.Component{
    constructor(props) {//构造函数中必须有props参数
        super(props);//调用父类构造方法
        this.state = {//初始化state
            dataList:[1,2,3],
            maxItem:3
        }
    }

    render() {
        return (
            <div>
                <ul>
                    {//遍历值
                        this.state.dataList.map((value, index) => {
                            return <li key={index}>{value}</li>
                        })
                    }
                </ul>
                <button onClick={()=>{//为按钮添加点击事件
                    let maxItem = this.state.maxItem+1;
                    let newArr = [...this.state.dataList,maxItem]
                    this.setState({
                        dataList:newArr,
                        maxItem:maxItem
                    })

                }}>加一</button>
            </div>
        );
    }
}

export default Test;

在这里插入图片描述

在这里插入图片描述

生命周期

组件运行过程中,存在不同的阶段。React为这些阶段提供了钩子方法(生命周期方法lifestyle methods),允许开发者自定义每个阶段自动执行的函数。

import React from 'react'; //第一步,导入React
class LifeCycle extends React.Component {
	constructor(props) {
    super(props);
    //构造方法
    console.log("constructor()");
	} 
    
    componentDidMount() {
        //组件挂载后调用
        console.log("componentDidMount()");
	} 
    
    componentWillUnmount() {
        //在组件从 DOM 中移除之前立刻被调用。
        console.log("componentWillUnmount()");
    } 
    
    componentDidUpdate() {
        //在组件完成更新后立即调用。在初始化时不会被调用。
        console.log("componentDidUpdate()");
    } 
    shouldComponentUpdate(nextProps, nextState){
        // 每当this.props或this.state有变化,在render方法执行之前,就会调用这个方法。
        // 该方法返回一个布尔值,表示是否应该继续执行render方法,即如果返回false,UI 就不会更新,默认返回true。
        // 组件挂载时,render方法的第一次执行,不会调用这个方法。
    	console.log("shouldComponentUpdate()");
    }
    
    render() {
        return (
        <div>
        <h1>React Life Cycle!</h1>
        </div>
        );
	}
} 

export default LifeCycle;

在这里插入图片描述

Model

分层

在这里插入图片描述

服务端系统:

  • Controller负责与用户直接打交道,渲染页面、提供接口等,侧重于展示型逻辑
  • Service负责处理业务逻辑,供Controller层调用
  • DataAccess 层负责与数据源对接,进行纯粹的数据读写,供Service层调用

前端代码结构:

  • Page负责与用户直接打交道:侧重于展示型交互逻辑
    • 渲染页面
    • 接受用户的操作输入
  • Model负责处理业务逻辑,为Page做数据、状态的读写、变换、暂存等
  • Service负责与HTTP接口对接,进行纯粹的数据读写

使用dva进行数据分层管理

dva官网

umi-dva插件

@Connect(mapModelToProps,mapDispatcherToProps):将model层中数据及函数绑定到page层

  1. mapModelToProps:
    • 将page层和model层进行连接
    • 返回model中的数据
    • 将返回的数据绑定到this.props中
  2. mapDispatcherToProps
    • 将定义的函数绑定到this.props中
    • 调用model层(reducers)中定义的函数
1. 引入dva框架

umi对dva进行了整合,在 config.js 中进行配置:

export default {
    dva: {
        immer: true,
        hmr: false,
    },
};
2. 创建model文件

umi中,约定 src/models 文件夹中定义model

在这里插入图片描述

export default {
    namespace:'TestData',
    state:{
        dataList:[1,2,3],
        maxItem:3
    }
}
3. 将model层数据导入page层
import React from "react";
import {connect} from "umi";

const namespace = "TestData";

// connect第一个回调函数,作用:将page层和model层进行链接,返回model层中的数据,并将数据绑定到 this.props
@connect((dvaState)=>{
    return {
        dataList:dvaState[namespace].dataList,
        maxItem: dvaState[namespace].maxItem
    }
})
class Test extends React.Component{
    render() {
        return (
            <div>
                <ul>
                    {//遍历值
                        this.props.dataList.map((value, index) => {
                            return <li key={index}>{value}</li>
                        })
                    }
                </ul>
            </div>
            
            ...
            );
    }
}

export default Test;

流程

  1. umi框架启动,会自动读取models目录下文件
  2. @Connect修饰符的第一个参数,接受一个方法,该方法必须返回 {}(对象),将接收到model数据
  3. 全局model中,通过 namespace 进行区分,所以通过 state[namespace] 进行数据获取
  4. 返回的数据会被封装到 this.props 中,所以通过 this.props.data 获取到model中的数据
4. 更新model中定义的数据
export default {
    namespace:'TestData',
    state:{
        dataList:[1,2,3],
        maxItem:3
    },
    reducers:{//定义一些函数
        addNewData:function (state){//state为修改前state
            let maxItem = state.maxItem+1;
            let newArr = [...state.dataList,maxItem]
            return {//通过return返回更新后的数据
                dataList:newArr,
                maxItem:maxItem
            }
        }
    }
}
import React from "react";
import {connect} from "umi";

const namespace = "TestData";

@connect(
    (dvaState)=>{
        return {
            dataList:dvaState[namespace].dataList,
            maxItem: dvaState[namespace].maxItem
        }
    },
    (dvaDispatch)=>{
        //dvaDispatch : 可以调用model层定义的函数
        return{
            add:function(){
                dvaDispatch({
                //通过dvaDispatcher调用model层定义的函数
                //@param : type——指定函数名 
                    //namespace/函数名
                    type:namespace+"/addNewData"
                })
            }
        }
    }
)
class Test extends React.Component{

    render() {
        return (
            <div>
                <ul>{//遍历值
                     this.props.dataList.map((value, index) => {
                         return <li key={index}>{value}</li>
                     })
                }
                </ul>
                <button onClick={()=>{
                    this.props.add();
                }}>加一</button>
            </div>
        );
    }
}

export default Test;

Model中异步请求数据

1. 请求工具类

src/utils 目录下创建 request.js ,用于异步请求数据

function checkStatus(response) {
    if (response.status >= 200 && response.status < 300) {
        return response;
    }

    const error = new Error(response.statusText);
    error.response = response;
    throw error;
}

/**
* Requests a URL, returning a promise.
* @param {string} url The URL we want to request
* @param {object} [options] The options we want to pass to "fetch"
* @return {object} An object containing either "data" or "err"
*/
export default async function request(url, options) {
    const response = await fetch(url, options);
    checkStatus(response);
    return await response.json();
}
2. model层添加异步请求
import request from '../utils/request';

export default {
    namespace:'TestData',
    state:{
        dataList:[],
        maxItem:0
    },
    reducers:{//定义一些函数
        addNewData:function (state,result){
            //state为修改前state,result就是拿到的结果数据
            if(result.data){
            //如果data存在,说明是初始化数据,直接返回
                return result.data;
            }

            let maxItem = state.maxItem+1;
            let newArr = [...state.dataList,maxItem]
            return {//通过return返回更新后的数据
                dataList:newArr,
                maxItem:maxItem
            }
        }
    },
    effects: { //新增effects配置,用于异步加载数据
        *initData(params, sagaEffects) { 
            //*表示 定义异步方法
            const {call, put} = sagaEffects; 
            //获取到call、put方法
            const url = "/ds/list"; // 定义请求的url
            let data = yield call(request, url); //执行请求
            yield put({ // 调用reducers中的方法
                type : "addNewData", //指定方法名
                data : data //传递ajax回来的数据
            });
        }
    }
}
3. 绑定model调用异步请求
import React from "react";
import {connect} from "umi";

const namespace = "TestData";

@connect(
    (dvaState)=>{
        return {
            dataList:dvaState[namespace].dataList,
            maxItem: dvaState[namespace].maxItem
        }
    },
    (dvaDispatch)=>{
        return{
            add:function(){
                dvaDispatch({
                    type:namespace+"/addNewData"
                })
            },
            initData:()=>{
                dvaDispatch({
                    type:namespace+"/initData"
                })
            }
        }
    }
)
class Test extends React.Component{
    componentDidMount() {//组件加载完后进行初始化操作
        this.props.initData();
    }

    render() {
        return (
            <div>
                <ul>
                    {//遍历值
                        this.props.dataList.map((value, index) => {
                            return <li key={index}>{value}</li>
                        })
                    }
                </ul>
                <button onClick={()=>{
                    this.props.add();
                }}>加一</button>
            </div>
        );
    }
}

export default Test;

在这里插入图片描述

原因:

返回的数据不是json格式,解析出错

4. moke数据

Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路。通过预先跟服务器端约定好的接口,模拟请求数据甚至逻辑,能够让前端开发独立自主,不会被服务端的开发所阻塞。

umi中支持对请求的模拟

在项目根目录下创建 mock 目录,创建 MockTestData.js 文件

在这里插入图片描述

export default {
    'GET /ds/test': function (req, res) { //模拟请求返回数据
        res.json({//返回
            dataList: [1, 2, 3, 4],
            maxItem: 4
        });
    }
}
import request from '../utils/request';

export default {
    namespace:'TestData',
    state:{
        dataList:[],
        maxItem:0
    },
    reducers:{
        addNewData:function (state,result){
            if(result.data){//判断result中的data是否存在,如果存在,说明是初始化数据,直接返回
                /*
                mock: 若响应中的字段名与page层的属性不一致,需要做映射
                return {
                    dataList:result.data.data,
                    maxItem:result.data.maxNum
                }
                */
                return result.data;
            }

            let maxItem = state.maxItem+1;
            let newArr = [...state.dataList,maxItem]
            return {
                dataList:newArr,
                maxItem:maxItem
            }
        }
    },
    effects: { 
        *initData(params, sagaEffects) { 
            const {call, put} = sagaEffects;
            const url = "/ds/test"; 

            let data = yield call(request, url); 
            yield put({ 
                type : "addNewData", 
                data : data 
            });
        }
    }
}

umi - model 注册

model示例
export default {
  namespace: '', // 表示在全局 state 上的 key
  state: {}, // 状态数据
  reducers: {}, // 管理同步方法,必须是纯函数
  effects: {}, // 管理异步操作,采用了 generator 的相关概念
  subscriptions: {}, // 订阅数据源
};
umi model注册

umi中,按照约定的目录 src/models 文件夹中被注册为model

model 分两类,一是全局 model,二是页面 model。全局 model 存于 /src/models/ 目录,所有页面都可引用;页面 model 不能被其他页面所引用。

  • src/models/**/*.js 为 global model
  • src/pages/**/models/**/*.js 为 page model
  • global model 全量载入,page model 在 production 时按需载入,在 development 时全量载入
  • page model 为 page js 所在路径下 models/**/*.js 的文件
  • page model 会向上查找,比如 page js 为 pages/a/b.js,他的 page model 为 pages/a/b/models/**/*.js + pages/a/models/**/*.js,依次类推
  • 约定 model.js 为单文件 model,解决只有一个 model 时不需要建 models 目录的问题,有 model.js 则不去找 models/**/*.js

React框架分类

  • Flux
    • 利用一个单向的数据流补充了React的组合视图组件,更像一种模式而非框架
  • Redux
    • JS状态容器,提供可预测的状态管理,Redux使组件状态共享变得简单
  • Ant Design of React
    • 阿里开源的基于React的企业级后台产品,继承了多种React框架
    • Ant Design提供了丰富的组件,包括:按钮、表单、表格、布局、分页、树组件、日历等

AntDesign

简介

Ant Design是阿里蚂蚁金服 基于React开发的UI组件 ,主要用于中后台系统的使用

官网

特性

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【开发】前端工程——ReactJS 的相关文章

  • Vue 3 Composition API 提供/注入在单文件组件中不起作用

    我正在使用 Composition API 在 VueJS 3 中创建一个库 我实现了提供 注入 如中所述docs https v3 vuejs org guide composition api provide inject html i
  • 位置特征检测:固定

    我正在尝试找到一个脚本来检测设备是否放置position fixed元素相对于视口而不是整个文档 目前 标准桌面浏览器和 Mobile Safari 适用于 iOS 5 都是这样做的 而 Android 设备则相对于整个文档放置固定元素 我
  • 使用 Angular 指令禁用文本选择

    我正在学习 JavaScript 和 AngularJS 我想使用 Angular Directive 禁用文本选择 我有该函数的 JavaScript 代码 function clearSelection if document sele
  • 如何使用 Playwright 使用选择器查找框架 (iframe)

    我有一个小问题 无法找到使用 Microsoft Playwright 框架的答案 根据您可以使用以下代码获取 iframe const frame page frame frame login 但是如何使用选择器来查找 iframe 并与
  • 想要动态处理与分页相关的页码显示:ReactJS

    我有一些分页逻辑工作得很好 唯一的问题是我只能让它显示并固定数量的页面可供选择 现在我已经把它放到了 5 页 但我希望它能够根据总记录动态更改 假设我有 100 条记录 每页限制为 10 条 将有 10 页 现在我只能让它以这种方式显示 第
  • IntersectionObserver是否支持水平滚动观察?

    我制作了几个垂直滚动 IntersectionObserver 模块 但我对水平滚动感兴趣 根将是 div 观察目标将是 img 我想观察当 img 放大但 div 保持视口宽度时的变化 我什至不确定移动 Safari 是否会将缩放后的图片
  • javascript 选择自定义光标 (svg)

    我正在动态地将光标更改为悬停时的本地 svg element on mouseover function this css cursor url svgs pointer svg 9 30 auto 工作正常 但我想选择该 svg 来操纵其
  • 如何通过单击链接来更改 div 的内容?

    这是我的网页的 修改后的 jsfiddle 它还有很多 而且定位是正确的 与此相反 http jsfiddle net ry0tec3p 1 http jsfiddle net ry0tec3p 1 a href class btn1 st
  • 如何使用 Javascript 设置查询字符串

    有没有办法使用 javascript 设置查询字符串的值 我的页面有一个过滤器列表 单击该列表时 它将更改右侧的页内结果窗格 我正在尝试更新 url 的查询字符串值 因此如果用户离开页面 然后单击 后退 按钮 他们将返回到最后一个过滤器选择
  • mongodb 聚合 - 累积字段的不同组值

    如果我有Player表格文件 name String score Int 我有Group文档 其中组代表玩家列表 groupName String players ObjectID 玩家可以属于多个组 我想做一个聚合Player文档 按以下
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • JavaScript eval("{}") 返回行为?

    根据ECMA 262 规范 http www ecma international org publications files ECMA ST Ecma 262 pdf 以下语句返回1 eval 1 eval 1 eval 1 var a
  • 如何从浏览器向服务器发送“页面将关闭”消息?

    我想向每个 html 文档添加一个脚本 JavaScript 该脚本向服务器发送两条消息 页面确实打开了 页面将关闭 此消息包含页面打开的时间 打开消息应在文档加载时 或加载完成时 发送 这是简单的部分 The close message
  • 使用javascript动态更新css内容

    需要将 css 更新为动态值 我不确定最好的方法是什么 div style zoom 1 div 缩放级别将根据窗口大小调整触发 应用程序将相应缩放 我将此应用程序加载到 cordova 中并让它在 iPAD 中运行 然后我意识到需要使用
  • react-native - 图像需要来自 JSON 的本地路径

    你好社区 我正在react native中开发一个测试应用程序 并尝试从本地存储位置获取图像 我实际在做什么 我将图像直接链接源提供给 var 并在渲染函数中调用此方法 react 0 14 8 react native 0 23 1 np
  • Flot 库将 y 轴设置为最小值 0 和最大值 24

    如何将 y 轴设置在 0 到 24 的范围内 这是我的代码 j plot j placeholder d1 xaxis mode time min new Date 2010 11 01 getTime max new Date 2011
  • 如何从 json 文件创建模型? (ExtJS)

    这是我想使用 json 文件创建的模型 Ext define Users extend Ext data Model fields name user id type int name user name type string 为了根据服
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • Java静态修饰符static

    1 Satic注意事项 1 Static修饰的方法可以被类调用或者直接使用 而未被static修饰的方法是实例方法 属于对象的 必须用对象调用 2 类在方法区 方法在栈内存 对象在堆内存 3 静态只能访问静态 不能访问实例 实例可以访问静态
  • windows7的5次shift实验

    原理 在win7的登录界面连续按5次shift键会弹出程序c windows system32 sethc exe 在开启win7时会出现正常登录和尝试修复 在尝试修复界面利用txt文本打开C盘 修改cmd exe为sethc exe 并将
  • FastDFS文件同步机制简介

    FastDFS文件同步机制简介 本篇文章转载于FastDFS作者 余庆 大佬的 FastDFS分享与交流 公众号 FastDFS 文件同步采用 binlog 异步复制方式 storage server 使用 binlog 文件记录文件上传
  • c语言警告文件末尾没有换行符,关于c ++:“文件末尾没有换行符”警告,即使在换行后也是如此...

    我最近一直在努力学习C 直到今天一直都很顺利 我正在尝试创建一个非常简单的应用程序 它基本上只是要求用户输入一个数字 然后显示该数字的阶乘 当我尝试在Cygwin中编译文件 g factorial cpp o fact 时 我收到以下警告
  • 微信小程序触底加载scroll-view

    微信小程序触底加载 scroll view 了解什么是触底加载 需求 有个固定高度的容器 实现容器里面的内容触底加载 1 内容盒子的高度 2 盒子里内容的总高度 3 滚动条的scrollTop 触底加载的原理就是 当里面的容器触底的时候进行
  • CPU核心数,线程数,时间片轮转机制解读

    CPU的核心数 CPU个数 是指物理上 即硬件上的核心数 核心数 是逻辑上的 简单理解为逻辑上模拟出的核心数 线程数 是同一时刻设备能并行执行的程序个数 线程数 cpu个数 核数 区分CPU线程数与JAVA多线程的概念 CPU线程数 在CP
  • 计算机的计算单位

    容量单位 在物理层面 高低电平记录信息 理论上只认识0 1两种状态 0 1能够表示的内容太少了 需要更大的容量表示方法 0 1称为bit 比特位 字节 1Byte 8bits 硬盘商一般使用10进位标记容量 500G一般格式化后只剩465G
  • Postgresql ODBC驱动,用sqlserver添加dblink跨库访问postgresql数据库

    在同样是SQLserver数据库跨库访问时 只需要以下方法 declare rowcount int set rowcount 0 set rowcount select COUNT from sys servers where name
  • APP自动化测试-7.移动端web app自动化测试

    APP自动化测试 7 移动端纯web应用测试 文章目录 APP自动化测试 7 移动端纯web应用测试 前言 一 移动端应用分类简述 二 web app基础配置 1 基础信息获取 2 驱动配置 3 启动 三 元素定位 总结 前言 移动端应用细
  • 在虚拟机上ifconfig结果中eth0没有IP地址(inet4)而是显示的是inet6

    问题描述 在虚拟机上执行ifconfig 结果中eth0没有显示IP地址inet4 而是显示inet6 出现原因 虚拟机上没有连接网络 解决方法 启动网卡 执行命令 ifup eth0 衍生问题 当执行上述命令时 却报如下错误 some o
  • 小程序工作学习:值的传递与操作以及target,options区别

    最近做小程序相关的东 学艺不精原理不了解 在前端界面的问题上遇到很多问题 好在在别人的帮助下以及在查资料补漏过程中还是有点收获的 问题 一 关于请求中如何能把这个页面的一下参数传递给下一页面 不能总是重复调用接口访问后台 这样的话影响加载页
  • python中jupyter notebook安装教程、常用插件和拓展配置及基本使用(全面)

    文章目录 1 jupyter安装 2 jupyter常用插件配置 2 1 Jupyter Notebook和conda的环境和包管理工具nb conda 2 2 Jupyter Notebook扩展jupyter contrib nbext
  • c#基础知识---集合之排序列表(SortedList)

    SortedList 类代表了一系列按照键来排序的键 值对 这些键值对可以通过键和索引来访问 排序列表是数组和哈希表的组合 它包含一个可使用键或索引访问各项的列表 如果您使用索引访问各项 则它是一个动态数组 ArrayList 如果您使用键
  • 【Spring】AOP实例—日志模块的实现

    AOP实例 日志模块 AOP能够使系统服务 例如 日志模块 安全模块 事务管理 模块化 并以声明的方式将它们应用到它们需要影响的组件中去 使业务组件会具有更高的内聚性并且会更加关注自身的业务 完全不需要了解涉及系统服务所带来复杂性 日志模块
  • Java BufferImage图片处理(获取宽高、图片截取、转换灰度图)

    Java BufferImage图片处理 获取宽高 截取 转换灰度图 1 效果图 2 源码 参考 这篇博客将介绍如何使用Java读取图片为byte 数组 或者BufferedImage及互相转换 并进行了转换图片为灰度图 截取部分区域等 1
  • 电脑win+r命令大全

    0 osk 打开键盘 1 msconfig 关闭系统开机启动项 2 ipconfig all ipconfig release ipconfig renew 3 convert g fs ntfs 盘符格式转换 g代表U盘符 4 gpedi
  • DSS部署-完整版

    文章目录 DSS部署流程 第一部分 背景 第二部分 准备虚拟机 环境初始化 1 准备虚拟机 2 环境初始化 关闭防火墙 关闭selinux 关闭swap 根据规划设置主机名 在master添加hosts 将桥接的IPv4流量传递到iptab
  • 现在机器人是用什么语言编程

    现在机器人是用什么语言编程 对于很多的家长们来说 孩子的学习一直都是他们非常关心和重视的一件事情 很多的家长在培养孩子的学习方面也可以说是相当的认真的 他们会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程
  • 【搜索引擎Solr】Apache Solr 神经搜索

    Sease 1 与 Alessandro Benedetti Apache Lucene Solr PMC 成员和提交者 和 Elia Porciani Sease 研发软件工程师 共同为开源社区贡献了 Apache Solr 中神经搜索的
  • 【开发】前端工程——ReactJS

    前置知识 JavaScript ES6 ReactJS 前端开发的四个阶段 1 静态页面阶段 在第一个阶段中前端页面都是静态的 所有前端代码和前端数据都是后端生成的 前端纯粹只是增加一些特殊效果 后端MVC模式 Model 模型层 提供 保