fs react 使用 保存文件_入门TypeScript编写React

1f2bd2e8a86ffc0c817bdc7b46afdd07.png

使用 create-react-app 开启 TypeScript

Create React App 是一个官方支持的创建 React 单页应用程序的CLI,它提供了一个零配置的现代构建设置。当你使用 Create React App 来创建一个新的 TypeScript React 工程时,你可以运行:

$ npx create-react-app my-app --typescript
$ # 或者
$ yarn create react-app my-app --typescript

如果在已有的工程中添加,也非常简单:

$ npm install --save typescript @types/node @types/react @types/react-dom @types/jest
$ # 或者
$ yarn add typescript @types/node @types/react @types/react-dom @types/jest

从零配置

创建 index.html 文件,以及src 目录,在 src目录中创建 index.tsx

TypeScript 的文件格式是 tsx

接下来安装必要的包和配置 package.json 文件:

"scripts": {"dev": "MODE=development webpack -w --mode=development","build": "MODE=production webpack --mode=production"
},
"dependencies": {"@types/react": "^16.8.13","@types/react-dom": "^16.8.3","react": "^16.8.6","react-dom": "^16.8.6"
},
"devDependencies": {"awesome-typescript-loader": "^5.2.1","source-map-loader": "^0.2.4","typescript": "^3.4.3","webpack": "^4.29.6","webpack-cli": "^3.3.0"
}

创建 tsconfig.jsonwebpack.config.js 文件:

{"compilerOptions": {"target": "es5","module": "commonjs","lib": ["dom","es2015"],"jsx": "react","sourceMap": true,"strict": true,"noImplicitAny": true,"baseUrl": "src","paths": {"@/*": ["./*"],},"esModuleInterop": true,"experimentalDecorators": true,},"include": ["./src/**/*"]
}
  • jsx 选择 react
  • lib 开启 domes2015
  • include 选择我们创建的 src 目录
var fs = require('fs')
var path = require('path')
var webpack = require('webpack')
const { CheckerPlugin } = require('awesome-typescript-loader');
var ROOT = path.resolve(__dirname);var entry = './src/index.tsx';
const MODE = process.env.MODE;
const plugins = [];
const config = {entry: entry,output: {path: ROOT + '/dist',filename: '[name].bundle.js'},module: {rules: [{test: /.ts[x]?$/,loader: ['awesome-typescript-loader']},{enforce: 'pre',test: /.ts[x]$/,loader: 'source-map-loader'}]},resolve: {extensions: ['.ts', '.tsx', '.js', '.json'],alias: {'@': ROOT + '/src'}},
}if (MODE === 'production') {config.plugins = [new CheckerPlugin(),...plugins];
}if (MODE === 'development') {config.devtool = 'inline-source-map';config.plugins = [new CheckerPlugin(),...plugins];
}module.exports = config;

类组件的使用

类组件是目前来说使用的最频繁的一种,因此我们需要了解到它。

Props 和 State

首先创建 Props 和 State 接口,Props 接口接收一个 name 参数,State 接口接收 color:

interface IProps {name: string;
}interface IState {color: "red" | "blueviolet"
}
class Home extends React.Component<IProps, IState> {constructor(props: IProps){super(props);this.state = {color: "red"}}public onClickColor = () => {const { color } = this.state;if (color === "red") {this.setState({color: "blueviolet"});}if (color === "blueviolet") {this.setState({color: "red"});}}public render(){const { name } = this.props;const { color } = this.state;return (<div><span style={{ color }}>{ name }</span><button onClick={this.onClickColor}>变颜色</button></div>);}
}export default Home;

如图:

b8837783b5253321e6ac576b51fecac2.png

App 中使用 Home 组件时我们可以得到明确的传递参数类型。

处理 Event 对象

有时候我们需要处理一下 Event 对象,一般 change 事件我们可以使用 React.ChangeEvent,click 事件可以使用 React.MouseEvent ,它们都接收一个 Element,如:

onClickColor = (ev: React.MouseEvent<HTMLButtonElement>) => {//
}

PureComponent

我们都知道 React 的刷新机制,因此如果每一次的变动都要刷新一下界面,这对于应用程序的性能来说是一个非常不科学的事情,因此在没有 PureComponent 之前,我们都需要手动使用 shouldComponentUpdate?(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: any): boolean; 来确认到底要不要刷新界面,如:

import * as React from "react";
import Typography from "@material-ui/core/Typography";interface IMyComparisonProps {text: string;
}class MyComparison extends React.Component<IMyComparisonProps> {constructor(props: IMyComparisonProps) {super(props);}public shouldComponentUpdate(nextProps: IMyComparisonProps) {if (this.props.text === nextProps.text) {return false;}return true;}public render() {const { text } = this.props;return (<Typography>Component 值:{ text }</Typography>);}
}export default MyComparison;

如果返回的是 false 那么将不调用 render,如果是 true 则调用 render

但是如果我们使用 PureComponent 那么就省略了这一步,我们可以不用关心组件是否要刷新,而是 React.PureComponent 来帮我们决定。在使用之前,我们还有一些注意事项要了解,React.PureComponent 是一个和 React.Component 几乎相同,唯一不同的是 React.PureComponent 帮助我们完成了 shouldComponentUpdate 的一些交浅的比较,因此在我们真实的组件设计中,我们一般会用于最后一个关键点的组件上。

Portals

ReactDOM 中提供了一个方法 createPortal,可以将节点渲染在父组件之外,但是你可以依然使用父组件上下文中的属性。这个特性在我所讲的全局对话框或者提示框中非常有用,它脱离了父节点的容器,插在最外层,在样式上就能通过 position: fixed 来覆盖整个文档树。

我们在 state 中定义了一个 open,它只接收一个布尔值,用于打开提示框或关闭提示框架,如:

export interface IPortalsProps {}export interface IPortalsState {open: boolean;
}

然后我们定义两个方法用于设置 open

public clickHandler = () => {this.setState({open: true,});
}public clickHandlerClose = () => {this.setState({open: false,});
}

最后在 render 方法中使用 ReactDOM.createPortal 来创建一个全局的 Alert,如:

import * as React from "react";
import * as ReactDOM from "react-dom";
import Button from "@material-ui/core/Button";
import Alert from "../Alert";
import {IPortalsProps,IPortalsState,
} from "./types";class MyPortals extends React.Component<IPortalsProps, IPortalsState> {constructor(props: IPortalsProps) {super(props);this.state = {open: false,};}public clickHandler = () => {this.setState({open: true,});}public clickHandlerClose = () => {this.setState({open: false,});}public render() {const { open } = this.state;return (<div><Buttonvariant="outlined"color="primary"onClick={this.clickHandler}>提示</Button>{ReactDOM.createPortal(<Alertopen={open}message="React Component Portals Use"handleClose={this.clickHandlerClose}/>,document.getElementById("app")!,)}</div>);}
}export default MyPortals;

Fragments

Fragments 可以让我们减少生成过多有副作用的节点,以往 render 必须返回单一节点,因此很多组件常常会产生过多无用的 divReact 根据这样的情况给予了一个组件来解决这个问题,它就是 Fragment

public render(){return (<React.Fragment><div></div><div></div></React.Fragment>)
}//orpublic render(){return (<><div></div><div></div></>)
}

函数组件以及 Hooks

Hooks 自去年10月发布以来,函数组件就派上了用场,React 的函数组件主要引用 SFC 返回(React.FunctionComponent),当然你也可以不引用 SFC 类型只不过返回的是(JSX.Element),这就是区别。

useState

以前:

interface IFuncComp {name: string;
}
const FuncComp: React.SFC<IFuncComp> = ({ name }) => {return (<div>{ name }</div>)
}

现在:

interface IFuncComp2 {name: string;
}const FuncComp2: React.SFC<IFuncComp2> = ({ name }) => {const [ num, setNum ] = React.useState<number>(0);return (<div>{ name } { num }<button onClick={() => {setNum(num + 1);}}>+</button></div>)
}
function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>];

由于 useState 被定义为一个泛型函数,因此类型可以由我们自己来指定。

useEffect

当你使用 useEffect 时,我们可以传入第三个参数来决定是否执行这个 callback ,这对于优化你的应用至关重要。

React.useEffect(() => {}, [num]);

useContext

对于 useContext 当你需要共享数据时可用:

interface IContext {name: string;
}
const initContext: IContext = {name: "",
};
const context = React.createContext(initContext);const FuncMainContext = () => {return (<><context.Provider value={initContext}><FuncContext /></context.Provider></>)
}const FuncContext = () => {const va = React.useContext(context);return (<div>{ va.name }</div>)
}

useReducer

如果你已经习惯 redux 不妨来看看 useReducer,假设我们需要通过按钮来更改文本颜色:

interface IState {color: "red" | "blueviolet"
}interface IAction {type: string;payload: any;
}const reducer = (prevState: IState, action: IAction) => {const { type, payload } = action;switch(type){case "COLOR_CHANGE" : {return { ...prevState, color: payload };}default: {return prevState;}}
}const App = () => {const initialState: IState = {color: "red"}const [state, dispatch ] = React.useReducer(reducer, initialState);return (<div><span style={{ color: state.color }}>icepy</span><button onClick={() => {dispatch({type: "COLOR_CHANGE",payload: state.color === "red" ? "blueviolet" : "red"});}}>change</button></div>);
}

useRef

当我们需要来引用原生DOM来处理某件事情时,useRef 可以辅助我们完成这项工作:

const App = () => {const inputEl = React.useRef<HTMLInputElement>(null);const onButtonClick = () => {if (inputEl && inputEl.current) {inputEl.current.focus();}}return (<><input ref={inputEl} type="text" /><button onClick={onButtonClick}>Focus</button></>);
}

useMemo

接下来我们可以说一说 useMemo ,这只能当作一次性能优化的选择,通常情况下假设我们的 state 有两个属性,它的场景可能如下:

const App = () => {const [ index, setIndex ] = React.useState<number>(0);const [ str, setStr ] = React.useState<string>("");const add = () => {return index * 100;}return (<><div>{index}-{str}-{add()}</div><div><button onClick={() => {setIndex(index + 1);}}>+</button><input type="text" onChange={(ev: React.ChangeEvent<HTMLInputElement>) => {setStr(ev.target.value);}}/></div></>);
}

无论如何修改 indexstr 都会引发 add() 的执行,这对于性能来说是很难接受的,因为 add() 只依赖于 index ,因此我们可以使用 useMemo 来优化此项。

const App = () => {const [ index, setIndex ] = React.useState<number>(0);const [ str, setStr ] = React.useState<string>("");const add = React.useMemo(() => {return index * 100;}, [index]);return (<><div>{index}-{str}-{add}</div><div><button onClick={() => {setIndex(index + 1);}}>+</button><input type="text" onChange={(ev: React.ChangeEvent<HTMLInputElement>) => {setStr(ev.target.value);}}/></div></>);
}

useMemo 的类型依赖于 factory 的返回值,我们可以观察一下它的描述文件:

function useMemo<T>(factory: () => T, deps: DependencyList | undefined): T;

useCallback

那么 useCallback 的使用和 useMemo 比较类似,但它返回的是缓存函数。 通常情况下,我们可以使用 useCallback 来处理父组件更新但不想子组件更新的问题,如:

interface IAppChildProps {callback: () => number;
}
const AppChild = ({ callback }: IAppChildProps) => {const [ index, setIndex ] = React.useState(() => callback());React.useEffect(() => {setIndex(callback());}, [callback])return (<div> { index }</div>);
}const App = () => {const [ index, setIndex ] = React.useState<number>(0);const [ str, setStr ] = React.useState<string>("");const callback = React.useCallback(() => {return index * 100;}, [index]);return (<><h1>{ str }</h1><AppChild callback={callback} /><div><button onClick={() => {setIndex(index + 1);}}>+</button><input type="text" onChange={(ev: React.ChangeEvent<HTMLInputElement>) => {setStr(ev.target.value);}}/></div></>);
}

useImperativeHandle

useImperativeHandle 可以让你使用 ref 将自定义的函数暴露给父组件,这种场景一般情况可以用于在父组件中操作子组件的DOM元素,需要和 forwardRef 配合使用:

interface IFancyInput {name: string;
}interface IFancyInputRef {focus: () => void;
}const fancyInput = (props: IFancyInput, ref: React.Ref<IFancyInputRef>) => {const inputEl = React.useRef<HTMLInputElement>(null);React.useImperativeHandle(ref, () => ({focus: () => {if (inputEl && inputEl.current) {inputEl.current.focus();}}}));return (<input ref={inputEl} type="text" defaultValue={props.name}/>);
}const FancyInput = React.forwardRef<IFancyInputRef, IFancyInput>(fancyInput);const App = () => {const fancyRef = React.useRef<IFancyInputRef>(null);return (<div><FancyInput ref={fancyRef} name="icepy" /><button onClick={() => {if (fancyRef && fancyRef.current) {fancyRef.current.focus();}}}>+</button></div>)
}

在组件树之间传递数据的 Context

在一个典型的 React 应用中,数据都是通过 Props 属性自上而下进行传递的,但某些情况下这些属性有多个组件需要共享,那么 Context 就提供了这样一种共享的方式。

当你使用 createContext 创建一个 Context 时它会返回一个 React.Context<T> 类型。

每一个 Context 对象都会返回一个 Provider 组件,它允许消费组件订阅 context 的变化,当 Provider 的value 发生变化时,它内部的所有消费组件都将重新渲染。

interface IContext {name: string;
}
const initContext:IContext = {name: "",
};
const Context = React.createContext(initContext);const AppChild = () => {const context  = React.useContext(Context);return (<div>{context.name}</div>)
}const AppChild1 = () => {const context  = React.useContext(Context);return (<div>{context.name}</div>)
}
const App = () => {const [ name, setName ] = React.useState("");return (<div><Context.Provider value={{ name }}><AppChild /><AppChild1 /></Context.Provider><button onClick={() => {setName("icepy");}}>+</button></div>)
}

我们也可以看一个类组件的例子:

interface IContext {name: string;
}
const initContext:IContext = {name: "",
};
const Context = React.createContext(initContext);class AppChild extends React.Component {static contextType = Context;public render(){const { name } = this.context;return (<div> { name }</div>)}
}
const App = () => {const [ name, setName ] = React.useState("");return (<div><Context.Provider value={{ name }}><AppChild /></Context.Provider><button onClick={() => {setName("icepy");}}>+</button></div>)
}

在 TypeScript 中 Context 支持的并不算太好,如:

static contextType?: Context<any>;
/*** If using the new style context, re-declare this in your class to be the* `React.ContextType` of your `static contextType`.** ```ts* static contextType = MyContext* context!: React.ContextType<typeof MyContext>* ```** @deprecated if used without a type annotation, or without static contextType* @see https://reactjs.org/docs/legacy-context.html*/
// TODO (TypeScript 3.0): unknown
context: any;

Ref 和 DOM

Refs 提供了一种方式,允许我们访问 DOM 节点或在 render 方法中创建的 React 元素。

const App = () => {const but = React.createRef<HTMLButtonElement>();return (<div><button ref={but} onClick={() => {if (but && but.current) {if (but.current.nodeName === "BUTTON") {alert("BUTTON");}}}}> + </button></div>)
}

获取 React 对象:

class AppChild extends React.Component {public onButtonClick = (target: EventTarget) => {console.dir(target);}public render(){return (<div>1234</div>)}
}const App = () => {const appChild = React.createRef<AppChild>();return (<><AppChild ref={appChild}/><button onClick={(ev: React.MouseEvent<HTMLButtonElement>) => {if (appChild && appChild.current) {appChild.current.onButtonClick(ev.target);}}}>+</button></>)
}

ref 也可以传递函数:

const App = () => {const inputCallback = (el: HTMLInputElement) => {console.log(el);}return (<div><input ref={inputCallback}/></div>)
}

对应的 useRef() 也非常类似,它可以很方便的保存任何可变值,这是因为它创建的是一个普通 JavaScript 对象。

const App = () => {const inputEl = React.useRef<HTMLInputElement>(null);return (<div><input ref={inputEl} type="text"/><button onClick={() => {if (inputEl && inputEl.current) {inputEl.current.focus();}}}>+</button></div>)
}

React 顶层其他 APIs

React 是整个 React 库的入口,顶层 APIs 中除了我们比较熟悉的如 Component 之外还有一些比较有用的,这里会介绍几种我们不常用但非常重要的顶层 APIs。

isValidElement

验证对象是否为 React 对象,返回值是 truefalse

React.isValidElement(object);

cloneElement

有时我们会遇到这样一个场景,就是 tabs 选项卡,对于它的设计我们可能会有一个预期,做一个简单版,比如:

<Tabs value={index} onChange={(value) => {setIndex(value);
}}><Tab value={1}>Tab 1</Tab><Tab value={2}>Tab 2</Tab><Tab value={3}>Tab 3</Tab>
</Tabs>
<div style={{ display: index === 1 ? "block": "none"}}>1</div>
<div style={{ display: index === 2 ? "block": "none"}}>2</div>
<div style={{ display: index === 3 ? "block": "none"}}>3</div>

点击 Tab 的时候需要把它的 onClick 事件替换成 Tabs 的 onChange,因此这里会使用到 cloneElement 方法来处理。

interface ITabsProps {value: number;onChange: (value: number) => void;children?: React.ReactNode;
}const tabsStyles: React.CSSProperties = {width: "100%",display: "flex",flexDirection: "row",
}const Tabs = (props: ITabsProps) => {const onChange = (value: number) => {props.onChange(value);}const renderTab = () => {const { children } = props;if (children && Array.isArray(children)) {const arrayChilds = children.map((v, i) => {if (React.isValidElement(v)) {const childrenProps = {onChange,key: `Tab-${i}`,};return React.cloneElement(v, childrenProps);}});return arrayChilds;}if (children && !Array.isArray(children)) {const childrenProps = {onChange,key: "Tab",};if (React.isValidElement(children)) {return React.cloneElement(children, childrenProps);}}}return (<div style={tabsStyles}>{renderTab()}</div>);
}

由于我们把 childrenProps 替换了,因此子元素的 Tab 就可以如此:

interface ITabProps {value: number;onChange?: (value: number) => void;children?: React.ReactNode;
}const tabStyles: React.CSSProperties = {width: "50px",marginRight: "10px",border: "1px solid red",textAlign: "center",cursor: "pointer"
}const Tab = (props: ITabProps) => {const changeHandler = () => {const { onChange, value } = props;if (onChange) {onChange(value);}}return (<divstyle={tabStyles}onClick={changeHandler}>{ props.children }</div>);
}

memo

React.memo 为高阶组件。它与 React.PureComponent 非常相似,但它适用于函数组件,但不适用于 class 组件。

此方法仅作为性能优化的方式而存在。
interface IProps {value: number;
}const AppChild = (props: IProps) => {return (<div>props.value: { props.value}</div>)
}const MemoAppChild = React.memo(AppChild);interface IState {date: Date;value: number;
}class App extends React.Component<{}, IState> {constructor(props: {}){super(props);this.state = {value: 0,date: new Date(),}}public componentDidMount(){setInterval(()=>{this.setState({date:new Date()})},1000)}public render(){return (<div><MemoAppChild value={this.state.value} /><div>{ this.state.date.toString() }</div></div>);}
}

如果你想更细节的控制,可以传入第二个参数,它是一个函数:

interface IProps {value: number;
}const AppChild = (props: IProps) => {return (<div>props.value: { props.value}</div>)
}type Equal = (prevProps: IProps, nextProps: IProps) => boolean;const areEqual: Equal = (prevProps, nextProps) => {if (prevProps.value === nextProps.value) {return true;} else {return false;}
}
const MemoAppChild = React.memo(AppChild, areEqual);interface IState {date: Date;value: number;
}class App extends React.Component<{}, IState> {constructor(props: {}){super(props);this.state = {value: 0,date: new Date(),}}public componentDidMount(){setInterval(()=>{this.setState({date:new Date()})},1000)}public render(){return (<div><MemoAppChild value={this.state.value} /><div>{ this.state.date.toString() }</div></div>);}
}

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

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

相关文章

快速开发工作流_03_集成在线流程设计器_内置用户免登录

接上一篇&#xff1a;快速开发工作流_02_集成在线流程设计器 https://gblfy.blog.csdn.net/article/details/103676784 文章目录八、内置用户免登录8.1. 定位url-config.js8.2. 替换url8.3. 添加配置类AdminRemoteAccountResource8.4. 启动类排除权限校验8.5. 码云地址八、内置…

强推!阿里数据科学家一次讲透数据中台

戳蓝字“CSDN云计算”关注我们哦&#xff01;来源 | 技术领导力社区编辑 | Emma阿里大数据和人工智能科学家 行在&#xff0c;阿里公共数据平台负责人 罗金鹏&#xff0c;在云栖大会、Data Tech等大会中分享到&#xff1a;阿里的“双中台ET”数字化转型方法论及成果&#xff0c…

关于增强学习你应该了解的五件事儿

摘要&#xff1a; 本文主要是讲解了机器学习中的增强学习方法的基本原理&#xff0c;常用算法及应用场景&#xff0c;最后给出了学习资源&#xff0c;对于初学者而言可以将其作为入门指南。 强化学习&#xff08;Reinforcement Learning&#xff09;是当前最热门的研究课题之一…

SpringBoot聚合项目总结

文章目录一、聚合项目架构二、依赖传递图解2.1. 常见场景2.2. 企业场景三、结构设计原则3.1. 模块层次清晰3.2. 模块之间耦合度低3.3. 功能互不影响3.4. 定位问题效率高3.5. 灵活易扩展四、架构设计优点4.1. 统一规范4.2. 版本统一管理4.2.1. 模块版本统一管理4.2.2. 依赖版本统…

容器精华问答 | 虚拟机和容器的区别是什么?

戳蓝字“CSDN云计算”关注我们哦&#xff01;云计算的发展日新月异&#xff0c;新技术层出不穷&#xff0c;尤其容器技术自2013年Docker容器问世以来一路高歌猛进红遍大江南北&#xff0c;与虚拟机相比&#xff0c;容器更显优势&#xff0c;有着更轻量、更快捷、占用资源更少&a…

战神笔记本电脑自带access吗_笔记本电脑卡顿不要急着换,这几个方法,让你的电脑流畅爆表...

电脑现在无论是学生还是上班族都成为了不可或缺的一个东西&#xff0c;笔记本电脑更是成为很多人的宠爱&#xff0c;方便携带。但是很多人的电脑都会面临一个问题&#xff0c;就是笔记本电脑使用没多久就开始卡顿&#xff0c;越来越不流畅。 …

一文看清深圳云栖阿里云重磅产品发布

摘要&#xff1a; 成立九年之后&#xff0c;阿里云不再仅仅是提供计算、存储、网络、安全。 事实上&#xff0c;我们每一天都有新功能在发布。 本文就和大家梳理一下&#xff0c;阿里云此次深圳云栖在云计算、大数据、人工智能、物联网方面的技术产品进展。 成立九年之后&#…

工作流实战_23_flowable 任务监听器 事件监听器

项目地址&#xff1a;https://gitee.com/lwj/flowable.git 分支flowable-base 视频讲解地址 https://www.bilibili.com/video/av79328344 监听器 任务监听器 针对userTask节点 事件监听器 针对任意节点 由于实际情况下我们会在节点会动态调用业务系统的接口去改变业务单据的状态…

pcb设计等长线误差_17种元器件PCB封装图鉴,美翻了(附PCB元件库)

元器件封装的构建是PCB设计中的一个重要环节&#xff0c;小小的一个错误很可能导致整个板子都不能工作以及工期的严重延误。常规器件的封装库一般CAD工具都有自带&#xff0c;也可以从器件原厂的设计文档、参考设计源图中获取。封装名称与图形如下No.1晶体管No.2晶振No.3电感No…

云计算风起云涌,超融合恰逢其时!

戳蓝字“CSDN云计算”关注我们哦&#xff01;“关于超融合市场&#xff0c;确实有一些声音。比如说市场很小&#xff0c;着手做这个业务方向会不会意味着未来堪忧&#xff1f;是不是没有前途&#xff1f;”深信服云BG总经理宋锐打趣说道。“这个问题&#xff0c;要站在客户的角…

Quick BI助力云上大数据分析---深圳云栖大会

摘要&#xff1a; 在3月29日深圳云栖大会的数据分析与可视化专场中&#xff0c;阿里云产品专家陌停对大数据智能分析产品 Quick BI 进行了深入的剖析。大会现场的精彩分享也赢得观众们的一直认可和热烈的反响。 大数据分析之路的挑战与期望 阿里巴巴作为一家大数据公司&#xf…

怎么添加一个程序集_门店小程序,微信小程序怎么添加店铺

现今随着互联网发展&#xff0c;越来越多选择网上购物代替实体店购物&#xff0c;微信作为最多人使用的社交软件&#xff0c;他的商机也被许多企业商家发展&#xff0c;进入微信分销小程序购物是现在最流行的购物方式&#xff0c;驱使很多实体店也纷纷加盟进驻门店分销小程序&a…

阿里云Quick BI——让人人都成为分析师

摘要&#xff1a; 在3月29日深圳云栖大会的数据分析与可视化专场中&#xff0c;阿里云产品专家潘炎峰&#xff08;陌停&#xff09;对大数据智能分析产品 Quick BI 进行了深入的剖析。大会现场的精彩分享也赢得观众们的一直认可和热烈的反响。 Quick BI诞生于阿里巴巴集团自身对…

华为已找到安卓才“替代品”?马云马斯克激辩人工智能未来;微软说:麻将AI系统终获突破;扭亏!中兴通讯上半年净利14.71亿……...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

Python的基本数据类型和数据类型的转换

TOC 数据类型 类型查看 type 可以使用type内置函数查看变量所指的对象类型 a1 b1.0 c"1" d1, e[1] f{1:1} g{1}print(type(a)) print(type(b)) print(type(c)) print(type(d)) print(type(e)) print(type(f)) print(type(g))isinstance **如字面意思,isinstance()…

法拉克机器人自动怎么调_在使用钢网印刷SMT贴片红胶时全自动印刷机的参数怎么调?...

电子厂在使用新钢网印刷作业时&#xff0c;都需要校正钢网位置&#xff0c;调整印刷机的的压力&#xff0c;印刷速度等&#xff0c;如果调对了参数即可以省红胶又可以使印刷效果达到完美。可以做到事半功倍效果。SMT贴片印刷机参数调整注意事项(1) 压力在4.5公斤左右(2) 红胶加…

CDN高级技术专家周哲:深度剖析短视频分发过程中的用户体验优化技术点

摘要&#xff1a; 深圳云栖大会已经圆满落幕&#xff0c;在3月29日飞天技术汇-弹性计算、网络和CDN专场中&#xff0c;阿里云CDN高级技术专家周哲为我们带来了《海量短视频极速分发》的主题分享&#xff0c;带领我们从视频内容采集、上传、存储和分发的角度介绍整体方案&#x…

flink开发案例_为什么说 Flink + AI 值得期待?

作者&#xff1a;秦江杰去年 11 月的 Flink Forward Asia 2019&#xff08;以下简称 FFA&#xff09; 上 Flink 社区提出了未来发展的几个主要方向&#xff0c;其中之一就是拥抱 AI [1]。实际上&#xff0c;近年来 AI 持续火热&#xff0c;各种计算框架、模型和算法层出不穷&am…

工作流实战_25_flowable 流程中的自动跳过

项目地址&#xff1a;https://gitee.com/lwj/flowable.git 分支flowable-base 背景&#xff1a;在实际场景中&#xff0c;我们往往会有这样的需求&#xff0c;当流程到达某一个节点的时候&#xff0c;我们让其自动的跳过去&#xff0c;不做任何操作。 如&#xff1a; 1、当当前…

阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1

摘要&#xff1a; 全球开源区块链领域影响最为广泛的Hyperledger Fabric日前宣布了1.1版本的正式发布&#xff0c;带来了一系列丰富的新功能以及在安全性、性能与扩展性等方面的显著提升。阿里云容器服务区块链解决方案第一时间同步升级&#xff0c;在v1.1新功能的基础上&#…