当前位置: 首页 > news >正文

React(五):受控组件、高阶组件、Portals、Fragment、CSS的编写方式

React(五)

  • 一、受控组件
    • 1.什么是受控组件(v-model)
    • 2.收集表单数据:input和单选框
    • 3.收集表单数据:下拉框
  • 二、非受控组件
  • 三、高阶组件
    • 1.什么是高阶组件
    • 2.高阶组件的应用1
    • 3.高阶组件的应用2-注入Context
    • 4.高阶组件的应用3-登录鉴权
    • 5.高阶组件的应用4-生命周期劫持
  • 四、Portals的使用
  • 五、Fragment的用法和短语
  • 六、React中的CSS
    • 1.内联样式style
    • 2.CSS模块化编写方式
    • 3.less的使用方案
    • 4.scss的使用方案
    • 5.CSS in JS
      • (1)ES6模板字符串调用函数
      • (2)使用styled-components的步骤
      • (3)模板字符串props接收数据
      • (4)attrs设置属性默认值
      • (5)styled-components高级特性
    • 6.React中动态添加class

一、受控组件

在这里插入图片描述

1.什么是受控组件(v-model)

类似vue中的v-model,就是双向数据绑定。

比如下面这两个input框,受控组件的条件就是有value值。

但是只有value值读取state中的值不行,这样input里的东西就不能改了,所以要有onChange事件去修改相应的值,实现输入框和state数据的同步。

export class App extends PureComponent {constructor() {super();this.state = {name: 'zzy',age: 18,}}changeInput(e) {console.log(e.target.value);this.setState({name: e.target.value})}render() {let { name } = this.state;return (<div>{/* 1.受控组件 */}<input type="text" value={name} onChange={(e) => this.changeInput(e)}/>{/* 2.非受控组件 */}<input type="text" /><h1>{name}</h1></div>)}
}

2.收集表单数据:input和单选框

React文档写的非常非常好,去看看

下面是一个提交用户名密码和单选框选中状态的案例

下面这个案例定义了两个输入框,分别是用户名和密码。还定义了一个单选框,有几个需要注意的地方。

  1. for由于对应js关键字,使用htmlFor代替

  2. 受控组件的特点,上面已经提到,必须写value且必须要有onChange事件,且该事件要修改对应的数据。

  3. 修改数据时我们可以去读取e.target.name找到相应的数据,把值修改为 e.target.value,这样的话就不用一个一个修改了。(键值读取变量用[]包裹)

  4. 提交的值我们可以根据表单的类别进行限制,如果是checkbox那么就收集选中状态(checked属性),如果是输入框那么就收集value

  5. 点击按钮提交表单数据的时候,数据已经是最新的了(onChange的时候就setState => render了),那么我们可以拿着最新的数据去发送ajax请求。

export class App extends PureComponent {constructor() {super();this.state = {userName: '',password: 0,isAgree: false,}}submitData() {console.log('提交', this.state.userName, this.state.password,this.state.isAgree)}changeInput(e) {console.log(e.target.value);//如果拿单选框的数据,那么拿到的是布尔值checkedconst value = e.target.type == 'checkbox' ? e.target.checked : e.target.value;this.setState({[e.target.name]: value})}render() {let { userName, password,isAgree } = this.state;return (<div><form action="">{/* 1.用户名 */}<label htmlFor="userName">用户名</label><inputtype="text"id='userName'name='userName'value={userName}onChange={(e) => this.changeInput(e)}/>{/* 2.密码 */}<label htmlFor="password"></label><inputtype="password"id='password'name='password'value={password}onChange={(e) => this.changeInput(e)}/>{/* 3.单选框 */}<inputtype="checkbox"name="isAgree"id="man"value="同意"checked={isAgree}onChange={(e) => this.changeInput(e)}/><label htmlFor="man">同意上述协议</label></form><button onClick={() => this.submitData()}>提交表单数据</button></div>)}
}

在这里插入图片描述

3.收集表单数据:下拉框

<select><option value="apple">苹果</option><option selected value="pear"></option><option value="peach">桃子</option>
</select>

请注意,由于 selected 属性的缘故,莉选项默认被选中。React 并不会使用 selected 属性,而是在根 select 标签上使用 value 属性。这在受控组件中更便捷,因为您只需要在根标签中更新它。例如:

export class App extends PureComponent {constructor() {super();this.state = {fruit: 'apple'}}submitData() {console.log('提交', this.state.fruit)}handleFruitChange(e) {this.setState({fruit: e.target.value})}   render() {let { fruit } = this.state;return (<div><form action=""><select value={fruit} onChange={(e) => this.handleFruitChange(e)}><option value="apple">苹果</option><option value="pear"></option><option value="peach">桃子</option></select></form><button onClick={() => this.submitData()}>提交表单数据</button></div>)}
}

这里如果select标签加了个multiple,那么意味着可以收集多个value,我们可以借助e.target.selectedOptions这个伪数组获取所有被选中的选项,拿到它们的值

handleFruitChange(e) {const options = Array.from(e.target.selectedOptions);const values = options.map(item => item.value);this.setState({fruit: values})
}  

二、非受控组件

一般不用非受控组件,因为这玩意儿就是直接操作DOM

  • 在非受控组件中通常使用defaultValue来设置默认值;
  • 如果要使用非受控组件中的数据,那么我们需要使用 ref 来从DOM节点中获取表单数据。
export default class App extends PureComponent {constructor(props) {super(props);this.myRef = createRef();}render() {return (<div><form onSubmit={e => this.handleSubmit(e)}><label htmlFor="username">用户: <input type="text" id="username" defaultValue='默认值' ref={this.myRef}/></label><input type="submit" value="提交"/></form></div>)}handleSubmit(event) {event.preventDefault();console.log(this.myRef.current.value);}
}

三、高阶组件

高阶函数:接收一个函数作为参数,或者返回一个函数。满足两个条件之一。
JavaScript中比较常见的filter、map、reduce都是高阶函数。

1.什么是高阶组件

高阶组件的英文是 Higher-Order Components,简称为 HOC。
官方的定义:高阶组件是参数为组件,返回值为新组件函数
也就是说,首先, 高阶组件本身不是一个组件,而是一个函数;其次,这个函数的参数是一个组件,返回值也是一个组件

举个例子:

//高阶组件:接收一个组件作为参数,返回另一个组件
function high(Component) {class newComponent extends React.PureComponent {render() {return (//可以做一些处理,比如统一在这里添加name属性<Component name='zzy'/>)}}return newComponent;
}//需要添加name属性的组件
class HelloWorld extends React.PureComponent {render() {console.log(this.props.name);//输出namereturn (<div>HelloWorld</div>)}
}//1.返回一个类组件
const Dj = high(HelloWorld)export class App extends React.PureComponent {render() {return (<div>{/* 2.对类进行实例化 */}<Dj/></div>)}
}

2.高阶组件的应用1

看下面这个例子,定义两个普通组件Component1、Component2,我们要给这两个组件的props上塞点数据,让它实例化的时候带着这个数据去展示,怎么做呢?

答案是定义高阶组件enhanceUserInfo,返回一个新组件,这个新组件把你传进来的组件作为儿子,并且把自己身上的数据给他{...this.state.userInfo},这样的话经过处理的Component1、Component2就可以拥有nameage,可以通过props读到。

function enhanceUserInfo(OriginComponent) {class NewComponent extends React.PureComponent {constructor(props) {super(props);this.state = {userInfo: {name: 'zzy',age: 18}}}render() {//把一些数据塞到你传进来的组件中return <OriginComponent {...this.props} {...this.state.userInfo}/>}}return NewComponent
}function Component1(props) {return <h1>Component1: {props.name}-{props.age}-{props.flag}</h1>
}
const NewCom1 = enhanceUserInfo(Component1);//也可以这样写
const NewCom2 = enhanceUserInfo(function(props) {return <h1>Component2: {props.name}-{props.age}-{props.sex}</h1>
})export class HOC extends PureComponent {render() {return (<div><h2>HOC</h2>{/* 如果在这里传值的话,传给的是NewComponent */}<NewCom1 flag='标识'/><NewCom2 sex='男'/></div>)}
}

还有个问题,如果我们往新组件中添加属性的话,是传给谁了呢?答案是传给了高阶组件中新组件newComponentprops中,我们可以通过{...this.props}再把它们传给你塞进去的组件OriginComponent

3.高阶组件的应用2-注入Context

细品一下,其实高阶组件的作用就是在我们要处理的组件上边包个父组件,父组件给它加点料,然后再把父组件扔出来用。

比如我们如果在App中使用context给下面两个子组件传值:

export class App extends PureComponent {render() {return (<div><h1>父组件App</h1><myContext.Provider value={{ name: 'zzy', age: 18 }}><HOC/><HOC2/></myContext.Provider></div>)}
}

那么很多组件都要接到这个数据,如果我们分别取每个子组件定义Consumer去接那真的是非常麻烦,此时我们就可以把注入value的这个操作封装一下,也就是使用高阶组件。

function enhanceContext(Component) {class NewComponent extends PureComponent {render() {return (<div><myContext.Consumer>{value => {return <Component {...value} />}}</myContext.Consumer></div>)}}return NewComponent;
}

那么我们在HOC和HOC2中就可以通过高阶组件注入value,并拿到传进来的value值:

export class HOC extends PureComponent {render() {return (<div><h2>子组件1HOC</h2><h3>HOC拿到传过来的value:{this.props.name + this.props.age}</h3></div>)}
}const newHOC = enhanceContext(HOC);
export default newHOC;
function HOC2(props) {return (<div><h2>子组件2HOC2</h2><h3>HOC2拿到穿过来的value:{props.name}-{props.age}</h3></div>)
}export default enhanceContext(HOC2);

4.高阶组件的应用3-登录鉴权

如果我们要实现,HOC和HOC2等组件在登录之后才能显示:

export class App extends PureComponent {render() {return (<div><h1>父组件App</h1>{/* 没登陆的话不展示,只有登录了才展示 */}<HOC /><HOC2 /></div>)}
}

定义高阶组件,拦截要展示的组件,进行鉴权:

function loginAuth(Component) {return (props) => {if(localStorage.getItem('token')) {return <Component {...props}/>}else {return <h2>没有登录,{Component.name}不展示,请先登录!</h2>}}
}export default loginAuth;

然后这两个组件导出的时候,调用一下就行了,然后把新的组件导出,新的这个组件来决定页面要展示什么东西:

export class HOC extends PureComponent {render() {return (<div><h2>子组件1HOC</h2></div>)}
}const newHOC = loginAuth(HOC);
export default newHOC;
function HOC2(props) {return (<div><h2>子组件2HOC2</h2></div>)
}export default loginAuth(HOC2);

结果:
在这里插入图片描述

5.高阶组件的应用4-生命周期劫持

比如我还可以在高阶组件中计算每个组件的挂载时间

function computeInterval(Component) {return class extends PureComponent {componentWillMount() {this.begin = Date.now();}componentDidMount() {this.over = Date.now();let interval = this.over - this.begin;console.log(`${Component.name}组件渲染时间为${interval}ms`)}render() {return <Component {...this.props}/>}}
}

在这里插入图片描述

四、Portals的使用

Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案:

ReactDOM.createPortal(React元素,哪个容器)
import {createPortal} from 'react-dom';
export class App extends PureComponent {render() {return (<div><h1>App渲染在root容器中</h1>{createPortal(<h2>我是h2我要渲染在zzy容器中</h2>, document.querySelector('#zzy'))}</div>)}
}

在这里插入图片描述

应用:创建一个Model组件,让组件标签中间插槽的元素全部进入model容器中,该容器是一个固定定位:

<div id="root"></div>
<div id="zzy"></div>
<div id="model"></div>
#model {position:fixed;left: 50%;top: 50%;background-color: skyblue;transform: translate(-50%, -50%);}
import {createPortal} from 'react-dom';
import Model from './Model';export class App extends PureComponent {render() {return (<div><h1>App渲染在root容器中</h1>{createPortal(<h2>我是h2我要渲染在zzy容器中</h2>, document.querySelector('#zzy'))}<Model><h1>数据结构</h1><h2>算法</h2><h3>冒泡排序</h3></Model></div>)}
}
import {createPortal} from 'react-dom';export class Model extends PureComponent {render() {return (<div><h1>Model</h1>{createPortal(this.props.children, document.querySelector('#model'))}</div>)}
}

在这里插入图片描述

五、Fragment的用法和短语

每次我们写结构都要包一个根div,并且这个div会在浏览器元素中显示
在这里插入图片描述

如果不想在浏览器中显示,可以引入Fragment:

import React, { PureComponent, Fragment } from 'react';
export class App extends PureComponent {render() {return (<Fragment><h1>奥里给</h1><h2>不用根</h2><h3>嗷嗷嗷</h3></Fragment>)}
}

在这里插入图片描述
语法糖:不用引入,直接<></>

render() {return (<><h1>奥里给</h1><h2>不用根</h2><h3>嗷嗷嗷</h3></>)}

但是这种语法糖在遍历需要绑定key的时候不能写,必须要写完整的标签才行噢~

六、React中的CSS

1.内联样式style

就是直接写行内style,要求是传入一个对象,而且属性名要以小驼峰命名,好处是可以读取state中的变量。

export class App extends PureComponent {constructor() {super();this.state = {size: 20}}large() {this.setState({size: this.state.size + 5})}render() {let {size} = this.state;return (<div><h1 style={{color:'red', fontSize: '30px'}}>奥里给</h1><h2 style={{color:'skyblue', fontSize:`${size}px`}}>样式</h2><button onClick={() => this.large()}>增大上面的字体</button></div>)}
}

2.CSS模块化编写方式

如果我们把每个组件的css分别定义相应的文件然后引入,那么也是没用的,所有的css文件第一次引入后都会默认是全局css,不管写哪个文件夹里,都是共享类名,如果后续还有其他css文件包含相同类名引入,同类名样式会被下一个渲染的依次覆盖。

但是我们组件开发肯定是希望每个组件有自己的样式,这一点Vue做的很好,可以加个scope,但是React咋办呢?

这里可以用css模块化的编写方案:
第一步:名字前面加.module

在这里插入图片描述

.box {border: 1px solid red;
}

第二步:需要用这里样式的组件中引入:

import appStyle from './App.module.css'

第三步:使用.属性名来读取我们对应的类名

{/* 2.CSS模块化*/}
<div className={appStyle.box}><h1>嗷嗷嗷</h1>
</div>

真的是非常麻烦啊,不过好像用的人还挺多的。

3.less的使用方案

参考Ant Design关于安装craco和less的配置

安装carco(create-react-app config缩写)和craco-less

npm install craco craco-less

修改package.json

/* package.json */
"scripts": {
-   "start": "react-scripts start",
-   "build": "react-scripts build",
-   "test": "react-scripts test",👇👇👇👇👇👇
+   "start": "craco start",
+   "build": "craco build",
+   "test": "craco test",
}

然后在项目根目录创建一个 craco.config.js 用于修改默认配置。

//craco.config.js文件
const CracoLessPlugin = require('craco-less')module.exports = {plugins: [{plugin: CracoLessPlugin,}]
}

ok,现在就可以在React中定义less并引入使用了

4.scss的使用方案

react中使用scss:

npm add node-sass@npm:dart-sass

5.CSS in JS

安装第三方库styled-components:

npm i styled-components

(1)ES6模板字符串调用函数

我们先补充一个知识,就是模板字符串竟然也能tmd调用函数,参数的构成是字符串先构成一个数组作为第一个参数,然后后面的参数是引用的nameage的值

function fun(...arg) {console.log(arg);
}
let name = 'zzy';
let age = 18;
fun`我叫${name},我今年${age}`;

在这里插入图片描述

(2)使用styled-components的步骤

为了方便演示,我们定义一个组件,写上类名

export class App extends PureComponent {render() {return (<div><h1 className='nav'>导航栏</h1><div className='box'><h2 className='title'>标题</h2><p className='content'>内容内容</p></div></div>)}
}

定义一个style.js文件,里面写:

import styled from 'styled-components';const NiuBi = styled.div`.nav {color: red;}.box {border: 1px solid black;.title {font-size: 40px;&:hover {background-color: blue;}}.content {color: skyblue;}}
`export default NiuBi;

是的你没看错,这样就借助这个styled-components的库创建了一个作为div并带着样式的NiuBi组件。

紧接着我们引入NiuBi,让他作为根节点包住元素,这样的话,NiuBi里面的所有样式,我们都可以在style.js中去写,而且不会和其他地方有冲突。

import NiuBi from './style';export class App extends PureComponent {render() {return (<NiuBi><h1 className='nav'>导航栏</h1><div className='box'><h2 className='title'>标题</h2><p className='content'>内容内容</p></div></NiuBi>)}
}

补充:为了写css方便,可以安装vscode的一个插件:

在这里插入图片描述

(3)模板字符串props接收数据

还有一个没见过的操作,css里因为用的是模板字符串,我们可以通过${}去读取变量,由于我们这个库返回的这个NiuBi是一个组件,那么我们可以通过组件标签给它传一些数据,读取的方式就是一个立即调用的箭头函数props => props.color

在这里插入图片描述

(4)attrs设置属性默认值

写法如下:参数是一个回调,回调的参数是props。可以给一些属性设置默认值,如果传了就用传的值,如果没传就用默认值。
在这里插入图片描述

(5)styled-components高级特性

1、支持样式的继承:

在这里插入图片描述

2、可以设置主题,然后下面的地方如果用到styled-components包裹就可以通过props.theme去读取主题的样式:

在这里插入图片描述

6.React中动态添加class

在这里插入图片描述
那么在React中怎么办呢?我们可以:

在这里插入图片描述

但是这样也比较繁琐,所以我们可以借助一个第三方库:classnames

1、安装:

npm install classnames

2、导入:

import classNames from 'classnames';

3、使用:

<h2 className={classNames('title',{active:true})}>标题</h2>

更多使用方式:

在这里插入图片描述
官方文档连接:https://github.com/JedWatson/classnames

相关文章:

React(五):受控组件、高阶组件、Portals、Fragment、CSS的编写方式

React&#xff08;五&#xff09;一、受控组件1.什么是受控组件&#xff08;v-model&#xff09;2.收集表单数据:input和单选框3.收集表单数据:下拉框二、非受控组件三、高阶组件1.什么是高阶组件2.高阶组件的应用13.高阶组件的应用2-注入Context4.高阶组件的应用3-登录鉴权5.高…...

MATLAB——系统环境

MATLAB概述MATLAB的发展MATLAB:MATrix LABoratory1980年前后&#xff0c;Cleve Moler教授编写的Linpack 和Eispack的接口程序。1984年&#xff0c;MATLAB第1版(DOS版)1992年&#xff0c;MATLAB4.0版1994年&#xff0c;MATLAB 4.2版1997年&#xff0c;MATLAB 5.0版1999年&#x…...

2 GateWay工作流程+GateWay搭建

GateWay工作流程GateWay搭建 核心流程图如下&#xff1a; 核心概念&#xff1a; 客户端向 Spring Cloud Gateway 发出请求。如果Gateway Handler Mapping确定请求与路由匹配&#xff0c;则将其发送到Gateway Web Handler 处理程序。此处理程序通过特定于请求的Fliter链运行请求…...

【微信小程序】富文本rich-text的图片预览效果的几种方法

前言 使用原生小程序开发&#xff0c;实现在富文本rich-text中的图片预览效果的几种方法对比。 1.正则wx.previewImage&#xff08;有明显不足&#xff09; 一个不需要用额外组件或插件的方法&#xff1a; 思路&#xff1a;使用正则把图片的url进行剖离出来&#xff0c;push…...

通信网络-Socket、Java中的网络支持、多线程服务器

前言 通信网络-Socket、Java中的网络支持、多线程服务器 场景&#xff1a;使用java网络创建一个聊天室 博客地址&#xff1a;芒果橙的个人博客 文章目录前言通信网络-SocketTCP/IPTCP/IP 模型端口Java中的网络支持概念1. InetAddress2. URL3. Socket4. Datagram多线程服务器应用…...

搞懂 JS this、call、apply、bind

搞懂 JS this、call、apply、bind javascript 的 this ECMAScript 规范中这样写&#xff1a; this 关键字执行为当前执行环境的 ThisBinding。 MDN 上这样写&#xff1a; In most cases, the value of this is determined by how a function is called. 在绝大多数情况下&…...

力扣209长度最小的子数组

209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xf…...

【mysql是怎样运行的】-InnoDB数据页结构

文章目录1. 数据库的存储结构&#xff1a;页1.1 磁盘与内存交互基本单位&#xff1a;页1.2 页结构概述1.3 页的上层结构2. 页的内部结构2.1 第1部分&#xff1a;文件头部和文件尾部2.1.1 File Header&#xff08;文件头部&#xff09;&#xff08;38字节&#xff09;2.1.2 File…...

VIM实用指南(10)语法自动补全插件coc.nvim

最近发现了一个新的自动补全插件coc.nvim异步&#xff0c;nodejs后端&#xff0c;配合它自身的lsp支持用起来非常舒服&#xff0c;同样也支持lsp和snippets&#xff0c;强烈推荐&#xff0c;值得一试。 1、使用vimplug安装插件 1.进入coc.nvim 在github的主页https://github.…...

【Vue3 第二十二章】过渡动画

一、基本用法 <Transition> 是一个内置组件&#xff0c;这意味着它在任意别的组件中都可以被使用&#xff0c;无需注册。它可以将进入和离开动画应用到通过默认插槽传递给它的元素或组件上。进入或离开可以由以下的条件之一触发&#xff1a; 由 v-if 所触发的切换由 v-…...

【linux】:进程状态(僵尸进程等)以及环境变量

文章目录 前言一.进程状态 进程的优先级二.环境变量总结前言 本篇文章是接着上一篇【linux】:进程概念的后续&#xff0c;对于有基础的同学可以直接看这篇文章&#xff0c;对于初学者来说强烈建议大家从上一篇的概念开始看起&#xff0c;上一篇主要解释了冯诺依曼体系以及操…...

【C语言——练习题】指针,你真的学会了吗?

✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦&#xff01;&#xff01;✨✨✨✨ 文章目录✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦&#xff01;&#xff01;✨✨✨✨一维数组练习题&#xff1a;字符数组练习题&#xff1a;字符指针练习题&#xff1a;二维数组练习题&am…...

Linux用户空间与内核空间通信(Netlink通信机制)

一&#xff0c;什么是Netlink通信机制 Netlink是linux提供的用于内核和用户态进程之间的通信方式。但是注意虽然Netlink主要用于用户空间和内核空间的通信&#xff0c;但是也能用于用户空间的两个进程通信。只是进程间通信有其他很多方式&#xff0c;一般不用Netlink。除非需要…...

3.3日报

今天写技术文档 跟需求对其 找负责人要上游数据接口&#xff0c;并处理更新时间问题 遇到的问题&#xff1a; 1.调用上游接口&#xff0c;需要token&#xff0c;而我的数据看板是不需要登录的&#xff0c;需要其他途径获取token 不同数据使用的接口不在一个项目中&#xff…...

并发编程-进程

并发编程-进程 进程创建启动 python提供了multiprocessing模块来支持多进程 multiprocessing.Process(targettask, args(arg,))用于创建进程 Process类相关方法 start() 启动进程join() 等待进程结束 启动子线程 【注意】线程启动代码块要放在__name__ __main__下 方式…...

LeetCode196_196. 删除重复的电子邮箱

LeetCode196_196. 删除重复的电子邮箱 一、描述 SQL架构 Create table If Not Exists Person (Id int, Email varchar(255)) Truncate table Person insert into Person (id, email) values (1, johnexample.com) insert into Person (id, email) values (2, bobexample.com…...

Auto.js Pro 替代品

Time : 2023年3月2日04:20:31 Mode : 持续更新中,排名不分先后.想起啥写啥 By : MemoryErHero NewTime: 2023年3月4日12:11:49 NO13. Autox.js文档&#xff1a; http://doc.autoxjs.com/ NO14. AutoJs6项目文档&#xff1a;https://github.com/SuperMonster003/AutoJs6 NO…...

红日(vulnstack)2 内网渗透ATTCK实战

环境配置 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;wmsi 攻击机&#xff1a;kali2022.03 web 192.168.111.80 10.10.10.80 自定义网卡8&#xff0c;自定义网卡18 PC 192.168.111.201 10.10.10.201 自定义网卡8&#xff0c;自定义网卡18 DC 192.168.52.1…...

一个好的工程项目管理软件所包含的主要功能

工程项目管理软件哪个好&#xff1f;借助Zoho Projects强大的工程项目管理软件&#xff0c;您的团队可以在预算范围内按时交付。从质量保证到预算规划&#xff0c;Zoho Projects的工程项目管理平台旨在推动切实的成果是Zoho Projects工程项目管理软件的优势。 高质量的可交付成…...

【大数据监控】Grafana、Spark、HDFS、YARN、Hbase指标性能监控安装部署详细文档

目录Grafana简介下载软件包安装部署修改配置文件创建用户创建Systemd服务启动 GrafanaSpark应用监控 Graphite_exporterHDFS 监控YARN 监控HBase 监控Grafana 简介 Grafana 是一款开源的数据可视化工具&#xff0c;使用 Grafana 可以非常轻松的将数据转成图表(如下图)的展现形…...

面试题---CSS

面试题---CSS子绝父相下&#xff0c;子百分比的问题两栏布局问题三栏布局问题---圣杯问题(三栏&#xff0c;左右固定&#xff0c;中间自适应)。内联样式与块级样式的区别怎么让一个 div 水平垂直居中分析比较 display: none 、visibility: hidden、opacity: 0优劣和适用场景css…...

【C++】vector

目录 vector 1. vector的成员函数 1.1 构造、析构和赋值运算符重载 1.1.1 构造函数 1.1.2 析构函数 1.1.3 赋值运算符重载 1.2 迭代器 1.3 容量 1.4 元素访问 1.4.1 遍历方法 1.5 修改器 1.6 配置器 2. vector的非成员函数 vector 1. vector的成员函数 1.1 构造…...

RocketMQ安装

RocketMQ安装 安装前准备 1.RocketMQ是使用Java语言编写的所以在安装该MQ前需要Java环境。 2.准备好RocketMQ ​ RocketMQ运行版本下载地址&#xff1a; https://www.apache.org/dyn/closer.cgi?pathrocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip ​ RocketMQ源码版…...

Spring——什么是IOC?

一、原则高内聚、低耦合二、什么是IOC&#xff1f;控制反转&#xff0c;把对象创建和对象之间的调用过程&#xff0c;交给spring进行管理三、使用IOC的目的是什么&#xff1f;降低耦合&#xff08;谁和谁的耦合&#xff1f;&#xff1f;如何降低的&#xff1f;&#xff09;原来…...

力扣(LeetCode)430. 扁平化多级双向链表(2023.03.04)

你会得到一个双链表&#xff0c;其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子指针可能指向一个单独的双向链表&#xff0c;也包含这些特殊的节点。这些子列表可以有一个或多个自己的子列表&#xff0c;以此类推&#xff0c;以生成如下面的示例…...

条款13:优先考虑const_iterator而非iterator

STL const_iterator等价于指向常量的指针&#xff08;pointer-to-const&#xff09;。它们都指向不能被修改的值。标准实践是能加上const就加上&#xff0c;这也指示我们需要一个迭代器时只要没必要修改迭代器指向的值&#xff0c;就应当使用const_iterator。 上面的说法对C11…...

23考研 长安大学846计算机考研复试《数据库》

长安大学846计算机考研,复试历年真题《数据库》。 目录: (1)数据库复习 (2)专业面试 (3)2017-2020年历年复试题 (4)复试的一些心得 数据库复习: 刚开始复试的时候,先把教材学习一遍(《数据库系统概念》 王珊 第五版),课后习题自己做一遍,网上有卖这本书的 配套…...

Android 9.0 系统去掉省电模式

1.概述 在9.0的系统rom开发定制化工作中,在系统中系统设置里面省电模式的选择中,有智能省电模式 省电模式 和超级省电模式三种 由于对rom系统做了大量定制功能开发,所以会在进入省电模式的时候 会出现某些不必要的问题,由于产品开发需求, 就要求去掉省电模式 不让平板进入…...

3 mmmmm

全部 答对 答错 单选题 7. 项目经理通知敏捷团队成员&#xff0c;由于意外的个人问题&#xff0c;产品负责人将不能参加即将到来的冲刺审查。这种情况下最可能的结果是什么&#xff1f; A project manager informs the agile team members that, due to unexpected personal …...

nvidia Jetson nano Linux内核编译

今天编译了nvidia 的jetson nano的内核。在网上找到的资料都比较老了。现在官网的最新版本是35.1.结合之前看到的博客的内容。关键是内核源码和交叉编译器的下载。找到官方文档后,编译成功!并且官方的文档是有一个编译脚本的。看之前的资料都是给出的命令,不知道这个nvbuild…...