umi框架实战项目

2023-10-31

29.9React课程

第10节:umi框架实战项目

(第10节:umi框架实战项目&)

第10节:umi框架实战项目&

Generator是异步解决方案,next执行下一个步骤

*可以放在后面也可以放在前面

Yield表示暂停

import React, { Component } from "react";

function* helloGenerator() {
  yield "hello";
  yield "world";
  yield "ending";
}

const hg = helloGenerator();
console.log(hg.next());
console.log(hg.next());
console.log(hg.next());
console.log(hg.next());

class GeneratorPage extends Component {
  render() {
    return <h1>GeneratorPage</h1>;
  }
}

export default GeneratorPage;
import React from "react";
import logo from "./logo.svg";
// import GeneratorPage from "./pages/GeneratorPage";
import ThunkPage from "./pages/ThunkPage";

function App() {
  return (
    <div className="App">
      {/* <GeneratorPage /> */}
      <ThunkPage />
    </div>
  );
}

export default App;

React-redux使用redux更加react,Redux-thunk支持dispatch传递函数,支持异步解决方案

import React, { Component } from "react";
import { BrowserRouter, Route, Link, Switch } from "react-router-dom";

import LoginPage from "./LoginPage";
import UserPage from "./UserPage";
import PrivatePage from "./PrivatePage";

class ThunkPage extends Component {
  render() {
    return (
      <div>
        <h1>Rudex - react-redux</h1>
        <BrowserRouter>
          <Link to="/login">登录</Link>
          <Link to="/user">用户中心</Link>
          <Switch>
            <Route path="/login" component={LoginPage} />
            {/* <Route path="/user" component={UserPage} /> */}
            <PrivatePage path="/user" component={UserPage} />
          </Switch>
        </BrowserRouter>
      </div>
    );
  }
}

export default ThunkPage;

LoginPage.js,通过thunk中间件发送异步请求

import React, { Component } from "react";

import { Redirect } from "react-router-dom";

import { connect } from "react-redux";

export default connect(
  state => ({
    isLogin: state.isLogin,
    loading: state.loading,
    error: state.error
  }),
  {
    //thunk
    // login: () => dispatch => {
    //   dispatch({ type: "requestLogin" });
    //   setTimeout(() => {
    //     dispatch({
    //       type: "requestSuccess"
    //     });
    //   }, 2000);
    // }
    //saga
    login: name => ({ type: "login", name })
  }
)(
  class LoginPage extends Component {
    constructor(props) {
      super(props);
      this.state = {
        name: ""
      };
    }
    setName = event => {
      this.setState({
        name: event.target.value
      });
    };
    render() {
      const { isLogin, loading, login, error } = this.props;

      if (isLogin) {
        return <Redirect to="/user" />;
      }

      const { name } = this.state;
      return (
        <div>
          <h1>登录</h1>
          {error && <p>{error}</p>}
          <input value={name} onChange={this.setName} />
          <button
            onClick={() => {
              login(name);
            }}
          >
            {loading ? "登录中..." : "登录"}
          </button>
        </div>
      );
    }
  }
);

UserPage.js

import React, { Component } from "react";

export default class UserPage extends Component {
  render() {
    return (
      <div>
        <h1>用户中心</h1>
      </div>
    );
  }
}

PrivatePage.js 路由守卫权限判断,可以传递path和component以及isLogin

传入动态值

import React, { Component } from "react";
import { Route, Redirect } from "react-router-dom";

import { connect } from "react-redux";

export default connect(state => ({
  isLogin: state.isLogin
}))(
  class PrivatePage extends Component {
    render() {
      const { path, component, isLogin } = this.props;

      if (isLogin) {
        return <Route path={path} component={component} />;
      }
      return (
        <Redirect to={{ pathname: "/login", state: { redirect: path } }} />
      );
    }
  }
);

store/index.js

import { createStore, applyMiddleware } from "redux";

import thunk from "redux-thunk";

//引入saga
import createSagaMiddleware from "redux-saga";

import mySaga from "./mySaga";

//创建中间件
const sagaMiddleware = createSagaMiddleware();

const initialLogin = {
  isLogin: false,
  loading: false,
  username: "",
  error: ""
};

const loginReducer = (state = { ...initialLogin }, action) => {
  switch (action.type) {
    case "requestLogin":
      return {
        ...state,
        loading: true
      };
    case "requestSuccess":
      return {
        ...state,
        isLogin: true,
        loading: false
      };
    case "requestFailure":
      return {
        ...state,
        error: action.err
      };
    default:
      return state;
  }
};

// const store = createStore(loginReducer, applyMiddleware(thunk));
const store = createStore(loginReducer, applyMiddleware(sagaMiddleware));
sagaMiddleware.run(mySaga);

export default store;

index.js

import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";

import { Provider } from "react-redux";
import store from "./store";

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById("root")
);

Redux-saga解决异步请求问题

This.props获取组件属性渲染哪一个组件,重定向动态路径的路由守卫,没有登录跳转到登录页。

对Route的包装

mySaga.js,takeEvery定制任务单,任务单有login任务菜户监控执行loginHandle

action是用户传入的,login(name),返回的res与err action都可以拿到

import { call, put, takeEvery } from "redux-saga/effects";

const Userservice = {
  login(name) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        if (name === "kaikeba") {
          resolve({ name: "kaikeba" });
        } else {
          reject("用户名或密码错误");
        }
      }, 1500);
    });
  }
};

//worker

function* loginHandle(action) {
  try {
    yield put({ type: "requestLogin" });
    const res = yield call(Userservice.login, action.name);
    yield put({ type: "requestSuccess", res });
  } catch (err) {
    yield put({ type: "requestFailure", err });
  }
}

//watcher saga

function* mySaga() {
  yield takeEvery("login", loginHandle);
}

export default mySaga;
import { createStore, applyMiddleware } from "redux";

import thunk from "redux-thunk";

//引入saga
import createSagaMiddleware from "redux-saga";

import mySaga from "./mySaga";

//创建中间件
const sagaMiddleware = createSagaMiddleware();

const initialLogin = {
  isLogin: false,
  loading: false,
  username: "",
  error: ""
};

const loginReducer = (state = { ...initialLogin }, action) => {
  switch (action.type) {
    case "requestLogin":
      return {
        ...state,
        loading: true
      };
    case "requestSuccess":
      return {
        ...state,
        isLogin: true,
        loading: false
      };
    case "requestFailure":
      return {
        ...state,
        error: action.err
      };
    default:
      return state;
  }
};

// const store = createStore(loginReducer, applyMiddleware(thunk));
const store = createStore(loginReducer, applyMiddleware(sagaMiddleware));
sagaMiddleware.run(mySaga);

export default store;

Switch独占路由

入口引入

路由守卫是对route的包装,没有登录跳转到登录页,this.props可以拿到path

动态值,可以根据其他路径重定向

Redux ,createStore中接收reducers,根据action不同返回不同state

初始化状态

发送请求等待结果,改变isLogin

初始化状态

根据action的不同返回不同的state

把默认值传递给state,发送请求改变loading状态

Export default 组件中使用redux

状态与组件绑定,使用redux

Provider内部通过上下文实现,provider包裹App

属性和dispatch映射,通过connect

导出connect包裹一个组件 ,高阶组件connect就是一个装饰器两个参数mapStateToProps和mapDispatchToProps就可以在组件内部通过this.props获取状态。

绑定State和dispatch,props中有了isLogin和loading。Connect中绑定mapStateToProps和mapDispatchToProps

onClick事件,点击按钮发送dispatch

对应请求,开始requestLogin,接下来发送requestSuccess是异步的

requestLogin同步的,redux没有支持异步能力,需要通过中间件thunk支持异步

点击执行,{}是一个事件,登录进入用户中心页

Thunk支持异步

Dispatch才具有解析函数能力,dispatch有两个操作发送requestLogin和requestSuccess

路由守卫也需要绑定状态,没有dispatch的派发只依赖状态,只需要绑定状态即可。

要从this.props中获取isLogin,标签上没有绑定isLogin,根据不同isLogin去不同页面

Saga支持异步实现方式更加简便,提供effect

Call发送请求,put更新状态,takeEvery定制任务单,任务单有任务执行否则不执行

模拟用户接口,传递数据

Action.name是用户login接口接收到的参数

如果请求有错误try...catch,传递res和err,action都能拿的到

Watcher设置监听,takeEvery任务单有login任务才会去监控

Action只有dispatch发送的时候才生成,

Saga也是redux的中间件

使用中间件

Login接收一个参数,传递name,action就能获取name

使用带参数的login

带参数的login,接收用户参数

保存用户输入的name

mySaga的接口

执行requestFailure,保留报错信息

Store中实现requestFailure

Err是通过mySaga中传递来的

要在loginHandle中传入action参数,

参数的传递,点击登录传递参数name ,用户传递进来的值

通过dispatch订阅的login发送过来login和name,就可以通过action来接收name了

之后进入到saga逻辑中来

Login中会接收到一个参数,进入判断,reject中的信息可以通过err捕获

store中可以通过action接收到err

解构出error

loginHandle是具体的行为,通过任务清单来触发函数

启动中间件,监听任务单里的任务

(umi&)

umi&

快速创建目录结构

指定css类型

创建动态路由

import React from 'react';
import { Router as DefaultRouter, Route, Switch } from 'react-router-dom';
import dynamic from 'umi/dynamic';
import renderRoutes from 'umi/lib/renderRoutes';
import history from '@tmp/history';
import { routerRedux } from 'dva';

const Router = routerRedux.ConnectedRouter;

const routes = [
  {
    path: '/',
    component: require('../../layouts/index.js').default,
    routes: [
      {
        path: '/404',
        exact: true,
        component: require('../404.js').default,
      },
      {
        path: '/about',
        exact: true,
        component: require('../about.js').default,
        title: 'about page',
        Routes: [
          require('../../routes/PrivateRoute.js').default,
          require('../../routes/Test.js').default,
        ],
      },
      {
        path: '/goods',
        exact: true,
        component: require('../goods/index.js').default,
      },
      {
        path: '/goods',
        exact: true,
        component: require('../goods.js').default,
      },
      {
        path: '/',
        exact: true,
        component: require('../index.js').default,
      },
      {
        path: '/login',
        exact: true,
        component: require('../login.js').default,
      },
      {
        path: '/users',
        exact: false,
        component: require('../users/_layout.js').default,
        routes: [
          {
            path: '/users',
            exact: true,
            component: require('../users/index.js').default,
          },
          {
            path: '/users/:id',
            exact: true,
            component: require('../users/$id.js').default,
          },
          {
            component: () =>
              React.createElement(
                require('/Users/kele/.config/yarn/global/node_modules/umi-build-dev/lib/plugins/404/NotFound.js')
                  .default,
                { pagesPath: 'pages', hasRoutesInConfig: false },
              ),
          },
        ],
      },
      {
        path: '/:post/commit',
        exact: true,
        component: require('../$post/commit.js').default,
      },
      {
        path: '/:post',
        exact: true,
        component: require('../$post/index.js').default,
      },
      {
        component: () =>
          React.createElement(
            require('/Users/kele/.config/yarn/global/node_modules/umi-build-dev/lib/plugins/404/NotFound.js')
              .default,
            { pagesPath: 'pages', hasRoutesInConfig: false },
          ),
      },
    ],
  },
  {
    component: () =>
      React.createElement(
        require('/Users/kele/.config/yarn/global/node_modules/umi-build-dev/lib/plugins/404/NotFound.js')
          .default,
        { pagesPath: 'pages', hasRoutesInConfig: false },
      ),
  },
];
window.g_routes = routes;
const plugins = require('umi/_runtimePlugin');
plugins.applyForEach('patchRoutes', { initialValue: routes });

export { routes };

export default class RouterWrapper extends React.Component {
  unListen() {}

  constructor(props) {
    super(props);

    // route change handler
    function routeChangeHandler(location, action) {
      plugins.applyForEach('onRouteChange', {
        initialValue: {
          routes,
          location,
          action,
        },
      });
    }
    this.unListen = history.listen(routeChangeHandler);
    routeChangeHandler(history.location);
  }

  componentWillUnmount() {
    this.unListen();
  }

  render() {
    const props = this.props || {};
    return <Router history={history}>{renderRoutes(routes, props)}</Router>;
  }
}

$id.js,通过props获取动态路由的值

import styles from "./$id.css";

export default function(props) {
  const { match } = props;
  console.log(match);
  return (
    <div className={styles.normal}>
      <h1>Page $id:: {match.params.id}</h1>
    </div>
  );
}

嵌套路由

_layout.js


import styles from './_layout.css';

export default function(props) {
  return (
    <div className={styles.normal}>
      <h1>Layout for ./users</h1>
      {
        props.children
      }
    </div>
  );
}

页面跳转


import styles from './index.css';

export default function() {
  return (
    <div className={styles.normal}>
      <h1>Page index</h1>
    </div>
  );
}

index.js


import styles from './index.css';

export default function() {
  return (
    <div className={styles.normal}>
      <h1>Page index</h1>
    </div>
  );
}

dva仓库要有namespace,export导出一个对象,接收状态要通过namespace来区分。

Reducers管理状态返回最新的状态,接收state和action,effects异步操作不能直接修改state通过reducer来修改state。

Namespace根据模块来区分创建很多的状态。

Action是触发器,通过type属性匹配到reducer或effec,playload属性则是数据体,传递参数给reducer和effect

(创建umi项目&)

创建umi项目&

dva使用model,dva内置connect,把状态映射到组件中。

Connect第一个参数来映射属性的,mapStateToProps,返回一个对象。

取到model中的goods,通过state.goods获取属性值。State是所有的状态集。

goodList映射到props中,通过props直接解构{goodList},打印数组。

创建新的namespace

更新数据状态,解构当前state接收新的另外新的对象title,通过action.payload参数传递

组件中映射addGoods,通过绑定dispatch获得,要接收一个参数,返回action即可。

Payload传递参数

addGoods要解析出来,function({addGoods}),直接使用addGoods即可。

addGoods发送dispatch在Model的reducers接收state和action,返回对象的更新

请求接口,通过effect进行处理。

Result就是数据

getList参数结构出来动作action和call与put

Axios发送请求

Call拿到结果通过put来更新数据。Action对应一个reducers来更新state,payload接收过来的参数就是res拿到的数据。

初始状态更新返回的action.payload,就是res的payload

函数式组件,组件渲染前就进行渲染需要通过hook实现

调用getList,通过命名空间调用effect中的方法

函数式组件,接收回调,执行就可以了

Dva-loading内置加载状态,直接把loading映射到组件上即可。

获取loading来使用,如果有goods命名空间加载,加载完毕置空

开启antd

基本布局,所有的子组件通过props放到content中,共同用于导航与页尾

404页面,exception已经保证好了样式

登录校验组件

Connect包裹函数组件

登录失败

通知组件,根据不同状态码弹窗

 

 

 

 

 

 

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

umi框架实战项目 的相关文章

  • React + Umi + Dva + Antd 简述 及创建项目过程简述

    React 你的第一个组件 React React是前端三大主流框架之一 你可以在React里传递多种类型的参数 如声明代码 帮助你渲染出UI 也可以是静态的HTML DOM元素 也可以传递动态变量 甚至是可交互的应用组件 安装react框
  • react项目按需加载报错 .libraryName is not a valid Plugin property

    babel presets react app plugins import libraryName antd style true 原配置如上会报错 libraryName is not a valid Plugin property g
  • React仿写网易云音乐项目

    文章目录 一 项目功能说明 二 最终效果 三 文件目录结构说明 四 项目技术栈 五 核心技术 1 配置项目别名 craco craco 2 使用reset css进行 css 重置 3 使用CSS Sprites 精灵图 4 使用 memo
  • 在react项目中,使用craco插件进行mobx配置解决方案

    在使用react项目中 不可避免的要使用蚂蚁金服出品的ant desgin前端UI组件 ant desgin推荐使用 craco 一个对 create react app 进行自定义配置的社区解决方案 对 create react app
  • 对useReducer的理解

    useReducer是React提供的一个高级Hook 它不像useEffect useState useRef等必须hook一样 没有它我们也可以正常完成需求的开发 但useReducer可以使我们的代码具有更好的可读性 可维护性 可预测
  • 【前端】react-markdown配置解析

    文章目录 react markdown基本配置 同步预览配置 MdEditorComponent js reducer js initBlogState js action types js sync actions js store js
  • Ant Design Pro 从零到一教程

    说在最前面的话 可是能全网唯一适合小白的antd教程 因为我找了接近一个周的教程 无论是视频 博客等等都没有比较完整的教程 所以才说这可能是唯一全网适合小白教程 文章末有相关学习链接 适用人群 喜欢看文字或者代码学习的人 学习的人掌握基本的
  • 组件间样式覆盖问题--CSS Modules

    1 组件间样式覆盖问题 问题 CityList 组件的样式 会影响 Map 组件的样式 原因 在配置路由时 CityList 和 Map 组件都被导入到项目中 那么组件的样式也就被导入到项目中了 如果组件之间样式名称相同 那么一个组件中的样
  • js扩展jquery对象基元的开发与代码编写

    js扩展jquery对象基元的开发与代码编写 function window undefined var Core function var eventarr var OnPageLoad undefined 获取USER信息 var ge
  • 三、react中类组件和函数组件

    简介 本篇我们只要介绍react中类组件与函数组件两种组件的写法 两者的优缺点 同时对在我们的项目开发中该使用类组件还是函数组件进行思考分析 废话不多说进入正题 类组件 设计思路 类组件时面向对象编程的思想 在其中我们去设计类组件时使用st
  • 关于Vue.js和React.js,听听国外的开发者怎么说?

    VueJS 与 ReactJS 到底怎么样如何 听听别人怎么说 使用所有新的库和框架 很难跟上所有这些库和框架 也就是说 这就需要您决定哪些是值得花时间的 让我们看看人们说什么 和Vue JS一起工作是很愉快的 我发现学习曲线很浅 然而 这
  • React的超详细讲解

    React React的重点 webpack webpack 是一个现代 JavaScript 应用程序的静态模块打包器 module bundler 当 webpack 处理应用程序时 它会递归地构建一个依赖关系图 dependency
  • hook中使用ref使用

    对于antd的fom表单 hook使用ref import React useState useEffect useRef from react const dateRef useRef dateRef current setFieldsV
  • react和react jsx基础

    本文是个人学习笔记 例子都是来自React Native官网 之前不是做前端的 没有使用过react 要学习react native做混合开发 react 包括react jsx还是得补补 react和react jsx react是一个j
  • Umi+Dva初印象<基础应用,结构,流转逻辑>

    目录 前言 知识储备 generator函数 Dva初识 实际交互 函数式组件 class组件 前言 项目初始为umi脚手架进行初始化 lt 初始化过程 http t csdn cn cuTaY gt 工程中加载了umi自带的antd ui
  • React解密:React Hooks函数之useCallback和useMemo

    之所以将useCallback和useMemo放到一起 从某种意义上说 他们都是性能优化的始作俑者 他们也有很多的共性 我们先来回顾一下class组件性能优化的点 调用 setState 就会触发组件的重新渲染 无论前后 state 是否相
  • React核心概念:状态提升

    上一节 表单 下一节 组合vs继承 React核心概念 状态提升 引言 添加第二个输入框 编写转换函数 状态提升 经验总结 引言 很多情况下我们使用的多个组件需要对同一个数据做出对应的反应 在这里我们推荐把这个共享的状态提升到距离这些组件最
  • umi 后台管理demo

    umi 后台管理demo umi react ts dva antd egg 有待优化 简单的前后端管理demo 接口提供增删查改 前端也有相应功能 github代码 https github com huiBuiling ql admin
  • React事件处理及事件流

    React事件处理 React事件处理是通过将事件处理器绑定到组建上处理事件 事件触发的同时更新组建的内部状态 内部状态更新会触发组件的重绘 React 元素的事件处理和 DOM 元素的事件处理很相似 但语法上的略有区别 在React中事件
  • error Missing “key“ prop for element in array react/jsx-key

    react遇到一个奇怪的问题 error Missing key prop for element in array react jsx key 检查了jsx中使用map的 都定义了key div otherList map item an

随机推荐

  • Linux中使用rm删除文件未释放磁盘

    原因 在Linux系统中 通过rm或者文件管理器删除文件 只是将它会从文件系统的目录结构上解除链接 unlink 也就是说只是删除了文件和系统目录结构的链接 如果文件在删除时是被打开的 有一个进程正在使用该文件 文件被进程锁定或者有进程一直
  • C语言函数之可变参数原理:va_start、va_arg及va_end

    说到C语言函数可变参数 我们最先想到的可能就是printf scanf printk了 在Linux 2 6 24 7内核源码里 printk函数原型如下 asmlinkage int printk const char fmt asmli
  • OLE接口用法

    转载请标明是引用于 http blog csdn net chenyujing1234 例子代码 编译工具 VS2005 http www rayfile com zh cn files 4468c85c 7a4e 11e1 8329 00
  • Ajax中如果url中含有中文,如何在后台中正确取得(针对IE和火狐)

    本人刚学习javaweb开发 在学习ajax时遇到一个问题 在此记录 问题如下 1 ajax代码 var url url地址 param 中国 httpRequest open GET url true httpRequest send n
  • 当我和ChatGPT聊Everything as Code

    以下是我和ChatGPT的聊天原文 一开始还有点惊喜 震惊 越到后面 越感到失望 网络上大肆宣传ChatGPT要代替人类的文章 我怕是专门炒流量赚钱的吧 我个人觉得 它离代替人类 还远着呢 Everything as Code 的目标又是什
  • 你好Avalonia框架

    起因 公司事业部是做移动等营业厅办理相关业务 无纸化系统的 简单的说就是以前去营业厅办理业务都需要各种打印文件 然后存放 无纸化系统就是把这些纸张的东西 比如身份证 业务内容 等等都使用系统进行处理 但是因为现在国家要求使用国产化系统 li
  • 华为云培训总结

    今天公司组治华为云的培训 培训大概思路如下 1 云计算入门 2 私有云搭建方案 3 华为云技术架构及特点 4 华为云产品演示 云计算入门 大概讲了3个小时跟论文的思路差不多 1 云计算的背景 2 国内外云计算平台的研究现状 3 华为对云计算
  • 数据库实验—ER模型

    E R图 实体性用举行表示 矩形内写明实体名 属性用椭圆表示 并用无向边将其与相应的实体性连接起来 练习用菱形框表示 框内写出联系名称 用无向边分别与有关实体型链接起来 同时要在无向边上注明联系的类型 1 1 1 n m n 下面用这节课的
  • JVM的常见问题及答案

    目录 1 入门部分 1 1 为什么要学习 JVM 1 2 你了解哪些 JVM 产品 1 3 JVM 的构成有哪几部分 2 类加载部分 2 1 你知道哪些类加载器 2 2 为什么需要多个类加载器 2 3 什么是双亲委派类加载模型 2 4 双亲
  • 视频直播方案测试评估

    腾讯 阿里云的视频直播服务与百度云LSS的设定与使用测试 前置条件 有已备案的可用域名 如果服务器在大陆 安装OBS软件 用于录制与推流 https obsproject com 安装可直播的软件 如kmplayer 可直接贴 rmtp u
  • 对数函数

    转自 https baike baidu com item E5 AF B9 E6 95 B0 E5 87 BD E6 95 B0 6013318 fr aladdin 一般地 对数函数以幂 真数 为自变量 指数为因变量 底数为常量的函数
  • 【Pandas】DataFrame+to_excel学习

    文章目录 1 DataFrame 2 to excel 写入单个sheet中 通过ExcelWriter写入多个工作表数据中 对excel中的工作表内容进行修改与追加 此文仅进行学习记录 1 DataFrame import pandas
  • Linux进阶_PAM认证机制详解

    成功不易 加倍努力 PAM认证机制 1 PAM 介绍 2 PAM架构 3 PAM相关文件 4 PAM工作原理 5 PAM 配置文件格式说明 6 PAM模块帮助 7 常用PAM模块 7 1 pam shells 模块 7 2 pam secu
  • AWD平台搭建

    这里采用github开源的AWD平台 https github com vidar team Cardinal 搭建平台 查看教程和官方文档 https cloud tencent com developer article 1744139
  • unity 之Animation

    Animation Clips Animation Clip 在untiy中有两种方式创建 一种是从外边导入 另一种是在unity内部创建 Animation from External Sources 外部导入的animation可以有
  • 海外自媒体多账号运营注意事项看这里!

    做跨境电商的小伙伴都知道 要想获得电商平台之外的流量 就必须做海外自媒体账号运营 且是多个账号运营 这样才能积累更多的流量 但海外自媒体账号运营不是一件容易的事情 注意事项比较多 很多小白刚入行不清楚 这里我就大家汇总了一些海外自媒体多账号
  • linux 设置端口密码,SSH更改默认端口号及实现免密码远程登陆

    近来在复习防火墙管理工具 iptables 的基本使用方法 涉及到对端口添加或删除防火墙策略的内容 之前对ssh更改默认端口号及免密码登录的方法不熟悉 这次做一个基本的总结防止自己遗忘 错误偏差及其他经验之处 还望各位多多支出 系统环境 两
  • 自定义横向ProgressBar样式圆角改直角

    横向progressBar的progress部分是圆角的 如果background是直角 那看起来不怎么和谐 所以这篇博文介绍progress部分改直角 在drawable目录下新建一个 progress style xml
  • R语言 第3章 R语言常用的数据管理(2)

    关注公众号凡花花的小窝 收获更多的考研计算机专业编程相关的资料 字符串处理 正则表达其实就是对文本进行模式匹配 所有语言中的正则表达式都有一些共同的特征 我们使用help regex 命令查看R正则表达的帮助内容 在我看来 正则表达式的主要
  • umi框架实战项目

    29 9React课程 第10节 umi框架实战项目 第10节 umi框架实战项目 第10节 umi框架实战项目 Generator是异步解决方案 next执行下一个步骤 可以放在后面也可以放在前面 Yield表示暂停 import Rea