ImmutableとReactの使い方

Mar 17, 2018 pm 01:15 PM
Immutable react 使用

今回は Immutable と React の使い方と、Immutable と React を使用する際の 注意点 について説明します。実際の事例を見てみましょう。

Immutable は React アプリケーションに数十倍の改善をもたらす可能性があります。React は人気が高かったと同時にその光が見えなくなったため、Immutable の導入は最近の JavaScript における素晴らしい発明だと言う人もいます。この記事では主に Immutable と React の実践について紹介しますので、必要な方は参考にしてください

Immutable は React アプリケーションに何十倍もの改善をもたらすと言う人もいます。また、Immutable の導入は JavaScript における素晴らしい発明だと言う人もいます。最近では、React が非常に人気があったため、その光は覆い隠されていました。これらは、少なくとも Immutable が非常に価値があることを示しています。以下で調べてみましょう。

JavaScript のオブジェクトは一般に変更可能 (Mutable) です。参照割り当てが使用されるため、新しいオブジェクトは元のオブジェクトを参照するだけです。新しいオブジェクトを変更すると、元のオブジェクトに影響します。たとえば、 foo={a: 1}; bar=foo; bar.a=2 この時点で foo.a も 2 に変更されていることがわかります。これによりメモリは節約できますが、アプリケーションが複雑になると非常に大きな隠れた危険が生じ、Mutable によってもたらされる利点は利益以上の価値があります。この問題を解決するには、shallowCopy(浅いコピー)やdeepCopy(深いコピー)を使って変更を避けるのが一般的ですが、これではCPUやメモリの無駄が発生します。
Immutable はこれらの問題をうまく解決できます。 foo={a: 1}; bar=foo; bar.a=2 你会发现此时 foo.a 也被改成了 2。虽然这样做可以节约内存,但当应用复杂后,这就造成了非常大的隐患,Mutable 带来的优点变得得不偿失。为了解决这个问题,一般的做法是使用 shallowCopy(浅拷贝)或 deepCopy(深拷贝)来避免被修改,但这样做造成了 CPU 和内存的浪费。
Immutable 可以很好地解决这些问题。

什么是 Immutable Data

Immutable Data 就是一旦创建,就不能再被更改的数据。对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。Immutable 实现的原理是 Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗,Immutable 使用了 Structural Sharing(结构共享),即如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其它节点则进行共享。请看下面动画:

擦,费了好大劲做了个 Gif 动画,竟然被强制转成了静态图,请移步 http://img.alicdn.com/tps/i2/TB1zzi_KXXXXXctXFXXbrb8OVXX-613-575.gif 观看
目前流行的 Immutable 库有两个:

1.immutable.js

Facebook 工程师 Lee Byron 花费 3 年时间打造,与 React 同期出现,但没有被默认放到 React 工具集里(React 提供了简化的 Helper)。它内部实现了一套完整的 Persistent Data Structure,还有很多易用的数据类型。像 Collection、List、Map、Set、Record、Seq。有非常全面的map、filter、groupBy、reduce``find函数式操作方法。同时 API 也尽量与 Object 或 Array 类似。

其中有 3 种最重要的数据结构说明一下:(Java 程序员应该最熟悉了)

Map:键值对集合,对应于 Object,ES6 也有专门的 Map 对象
List:有序可重复的列表,对应于 Array
Set:无序且不可重复的列表

2.seamless-immutable

与 Immutable.js 学院派的风格不同,seamless-immutable

不変データとは

不変データとは、一度作成されると変更できないデータです。 Immutable オブジェクトを変更、追加、または削除すると、新しい Immutable オブジェクトが返されます。 Immutable 実装の原則は Persistent Data Structure (永続的なデータ構造) です。つまり、古いデータを使用して新しいデータを作成する場合、古いデータが利用可能であると同時に変更されていないことを保証する必要があります。同時に、deepCopy によるすべてのノードのコピーによるパフォーマンスの低下を避けるために、Immutable は Structural Sharing (構造共有) を使用します。つまり、オブジェクト ツリー内のノードが変更された場合、そのノードとその親ノードのみが影響を受けます。が変更され、他のノードが変更されてから共有されます。下のアニメーションをご覧ください:

せっかくGifアニメーションを作ったのに、強制的に静止画に変換してしまいました。 http://img .alicdn.com/tps/i2/TB1zzi_KXXXXXctXFXXbrb8OVXX-613-575.gif を見る
現在、2 つの人気のある不変ライブラリがあります:

1.immutable.js

Facebook エンジニア Lee Byron Spend 構築に 3 年かかり、React と同時に登場しましたが、デフォルトでは React ツール セットに含まれていませんでした (React は簡素化されたヘルパーを提供します)。内部的には永続データ構造の完全なセットと、使いやすい多くのデータ型

を実装しています。 。コレクション、リスト、マップ、セット、レコード、シーケンスなど。非常に包括的なマップ、フィルター、グループバイ、リデュース、および検索の機能的な操作メソッドがあります。同時に、API はオブジェクトまたは配列に可能な限り似ています。

説明する最も重要なデータ構造が 3 つあります: (Java プログラマーは最もよく知っているはずです)

Map: オブジェクトに対応するキーと値のペアのコレクション。ES6 には特別な Map オブジェクトもあります
リスト:順序付けされた繰り返し可能リスト、配列に対応
セット: 順序付けされていない繰り返し不可能なリスト2.simless-immutable

🎜は、Immutable.jsのアカデミックなスタイルとは異なります、 Seamless-immutable code > 完全な永続データ構造は実装されていませんが、JavaScript の Array オブジェクトと Object オブジェクトを拡張するために Object.defineProperty を使用します。この API は Array と Object に基づいています。 on 配列およびオブジェクトと同じ。コードベースは非常に小さく、圧縮してダウンロードするとわずか 2K です。 Immutable.js は 16K 圧縮されています。 🎜🎜 2 つの違いを感じるための以下のコード: 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">// 原来的写法 let foo = {a: {b: 1}}; let bar = foo; bar.a.b = 2; console.log(foo.a.b); // 打印 2 console.log(foo === bar); // 打印 true // 使用 immutable.js 后 import Immutable from ‘immutable'; foo = Immutable.fromJS({a: {b: 1}}); bar = foo.setIn([‘a', ‘b'], 2);  // 使用 setIn 赋值 console.log(foo.getIn([‘a', ‘b'])); // 使用 getIn 取值,打印 1 console.log(foo === bar); // 打印 false // 使用 seamless-immutable.js 后 import SImmutable from ‘seamless-immutable'; foo = SImmutable({a: {b: 1}}) bar = foo.merge({a: { b: 2}})  // 使用 merge 赋值 console.log(foo.a.b); // 像原生 Object 一样取值,打印 1 console.log(foo === bar); // 打印 false</pre><div class="contentsignin">ログイン後にコピー</div></div>🎜🎜🎜Immutable の利点🎜🎜🎜🎜🎜1. Immutable は Mutable によってもたらされる複雑さを軽減します🎜🎜🎜 変数 (Mutable) データは時間と価値を結合します。データを追跡するのは困難です。 🎜🎜たとえば、次のコード: 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">function touchAndLog(touchFn) {   let data = { key: ‘value' };   touchFn(data);   console.log(data.key); // 猜猜会打印什么? }</pre><div class="contentsignin">ログイン後にコピー</div></div>🎜 touchFn のコードを見ないと、それがデータに何をするかわからないので、何が出力されるかを知ることは不可能です (これはナンセンスではありませんか) )。ただし、データが Immutable であれば、値が出力されることを確実に知ることができます。 🎜🎜🎜🎜2. メモリを保存します🎜🎜🎜<p style="text-align: left;">Immutable.js 使用了 Structure Sharing 会尽量复用内存。没有被引用的对象会被垃圾回收。</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">import { Map} from ‘immutable';  let a = Map({  select: ‘users',  filter: Map({ name: ‘Cam' }) }) let b = a.set(‘select', ‘people'); a === b; // false a.get(‘filter') === b.get(‘filter'); // true</pre><div class="contentsignin">ログイン後にコピー</div></div> <p style="text-align: left;">上面 a 和 b 共享了没有变化的 `filter` 节点。</p> <p style="text-align: left;"><span style="color: #ff0000"><strong>3 . Undo/Redo,Copy/Paste,甚至时间旅行这些功能做起来小菜一碟</strong></span></p> <p style="text-align: left;">因为每次数据都是不一样的,只要把这些数据放到一个数组里储存起来,想回退到哪里就拿出对应数据即可,很容易开发出撤销重做这种功能。</p> <p style="text-align: left;">后面我会提供 Flux 做 Undo 的示例。</p> <p style="text-align: left;"><span style="color: #ff0000"><strong>4 . 并发安全</strong></span></p> <p style="text-align: left;">传统的并发非常难做,因为要处理各种数据不一致问题,因此『聪明人』发明了各种锁来解决。但使用了 Immutable 之后,数据天生是不可变的,并发锁就不需要了。</p> <p style="text-align: left;">然而现在并没什么卵用,因为 JavaScript 还是单线程运行的啊。但未来可能会加入,提前解决未来的问题不也挺好吗?</p> <p style="text-align: left;"><span style="color: #ff0000"><strong>拥抱函数式编程</strong></span></p> <p style="text-align: left;">Immutable 本身就是函数式编程中的概念,纯函数式编程比<a href="http://www.php.cn/code/6286.html" target="_blank">面向对象</a>更适用于前端开发。因为只要输入一致,输出必然一致,这样开发的组件更易于调试和组装。</p> <p style="text-align: left;">像 ClojureScript,Elm 等函数式编程语言中的数据类型天生都是 Immutable 的,这也是为什么 ClojureScript 基于 React 的框架 — Om 性能比 React 还要好的原因。</p> <p style="text-align: left;"><span style="color: #ff0000"><strong>使用 Immutable 的缺点</strong></span></p> <p style="text-align: left;">需要学习新的 API</p> <p style="text-align: left;">No Comments</p> <p style="text-align: left;">增加了资源文件大小</p> <p style="text-align: left;">No Comments</p> <p style="text-align: left;">容易与原生对象混淆</p> <p style="text-align: left;">这点是我们使用 Immutable.js 过程中遇到最大的问题。写代码要做思维上的转变。</p> <p style="text-align: left;">虽然 Immutable.js 尽量尝试把 API 设计的原生对象类似,有的时候还是很难区别到底是 Immutable 对象还是原生对象,容易混淆操作。</p> <p style="text-align: left;">Immutable 中的 Map 和 List 虽对应原生 Object 和 Array,但操作非常不同,比如你要用 map.get(‘key') 而不是 map.key,array.get(0) 而不是 array[0]。另外 Immutable 每次修改都会返回新对象,也很容易忘记赋值。</p> <p style="text-align: left;">当使用外部库的时候,一般需要使用原生对象,也很容易忘记转换。</p> <p style="text-align: left;">下面给出一些办法来避免类似问题发生:</p> <p style="text-align: left;">使用 Flow 或 TypeScript 这类有静态类型检查的工具</p> <p style="text-align: left;">约定<a href="http://www.php.cn/code/12015.html" target="_blank">变量命名规则</a>:如所有 Immutable 类型对象以 $$ 开头。</p> <p style="text-align: left;">使用 Immutable.fromJS 而不是 Immutable.Map 或 Immutable.List 来<a href="http://www.php.cn/wiki/69.html" target="_blank">创建对象</a>,这样可以避免 Immutable 和原生对象间的混用。</p> <p style="text-align: left;"><strong>更多认识</strong></p> <p style="text-align: left;"><span style="color: #ff0000"><strong>1 . Immutable.is</strong></span></p> <p style="text-align: left;">两个 immutable 对象可以使用 === 来比较,这样是直接比较内存地址,性能最好。但即使两个对象的值是一样的,也会返回 false:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">let map1 = Immutable.Map({a:1, b:1, c:1}); let map2 = Immutable.Map({a:1, b:1, c:1}); map1 === map2;       // false</pre><div class="contentsignin">ログイン後にコピー</div></div> <p style="text-align: left;">为了直接比较对象的值,immutable.js 提供了 Immutable.is 来做『值比较』,结果如下:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">Immutable.is(map1, map2); // true</pre><div class="contentsignin">ログイン後にコピー</div></div> <p style="text-align: left;">Immutable.is 比较的是两个对象的 hashCode 或 valueOf(对于 JavaScript 对象)。由于 immutable 内部使用了 Trie 数据结构来存储,只要两个对象的 hashCode 相等,值就是一样的。这样的算法避免了深度遍历比较,性能非常好。</p> <p style="text-align: left;">后面会使用 Immutable.is 来减少 React 重复渲染,提高性能。</p> <p style="text-align: left;">另外,还有 mori、cortex 等,因为类似就不再介绍。</p> <p style="text-align: left;"><span style="color: #ff0000"><strong>2 . 与 Object.freeze、const 区别</strong></span></p> <p style="text-align: left;">Object.freeze 和 ES6 中新加入的 const 都可以达到防止对象被篡改的功能,但它们是 shallowCopy 的。对象层级一深就要特殊处理了。</p> <p style="text-align: left;"><span style="color: #ff0000"><strong>3 . Cursor 的概念</strong></span></p> <p style="text-align: left;">这个 Cursor 和数据库中的游标是完全不同的概念。</p> <p style="text-align: left;">由于 Immutable 数据一般嵌套非常深,为了便于访问深层数据,Cursor 提供了可以直接访问这个深层数据的引用。</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">import Immutable from ‘immutable'; import Cursor from ‘immutable/contrib/cursor'; let data = Immutable.fromJS({ a: { b: { c: 1 } } }); // 让 cursor 指向 { c: 1 } let cursor = Cursor.from(data, [‘a', ‘b'], newData =&gt; { // 当 cursor 或其子 cursor 执行 update 时调用 console.log(newData); }); cursor.get(‘c'); // 1 cursor = cursor.update(‘c', x =&gt; x + 1); cursor.get(‘c'); // 2</pre><div class="contentsignin">ログイン後にコピー</div></div> <p style="text-align: left;"><span style="color: #ff0000"><strong>实践</strong></span></p> <p style="text-align: left;">与 React 搭配使用,Pure Render</p> <p style="text-align: left;">熟悉 React 的都知道,React 做<a href="http://www.php.cn/html/html-jsyouhua.html" target="_blank">性能优化</a>时有一个避免重复渲染的大招,就是使用 shouldComponentUpdate(),但它默认返回 true,即始终会执行 render() 方法,然后做 Virtual DOM 比较,并得出是否需要做真实 DOM 更新,这里往往会带来很多无必要的渲染并成为性能瓶颈。</p> <p style="text-align: left;">当然我们也可以在<code> shouldComponentUpdate() 中使用使用 deepCopy 和 deepCompare 来避免无必要的 render(),但 deepCopy 和 deepCompare 一般都是非常耗性能的。

Immutable 则提供了简洁高效的判断数据是否变化的方法,只需 === 和 is 比较就能知道是否需要执行 render(),而这个操作几乎 0 成本,所以可以极大提高性能。修改后的 shouldComponentUpdate 是这样的:

import { is } from ‘immutable';
 shouldComponentUpdate: (nextProps = {}, nextState = {}) => {
  const thisProps = this.props || {}, thisState = this.state || {};
  if (Object.keys(thisProps).length !== Object.keys(nextProps).length ||
   Object.keys(thisState).length !== Object.keys(nextState).length) {
    return true;
  }
  for (const key in nextProps) {
   if (thisProps[key] !== nextProps[key] || !is(thisProps[key],      nextProps[key])) {
   return true;
  }
 }
  for (const key in nextState) {
   if (thisState[key] !== nextState[key] || !is(thisState[key], nextState[key])) {
    return true;
   }
  }
  return false;
 }
ログイン後にコピー

使用 Immutable 后,如下图,当红色节点的 state 变化后,不会再渲染树中的所有节点,而是只渲染图中绿色的部分:

你也可以借助 React.addons.PureRenderMixin 或支持 class 语法的pure-render-decorator 来实现。

setState 的一个技巧

React 建议把 this.state 当作 Immutable 的,因此修改前需要做一个 deepCopy,显得麻烦:

import ‘_' from ‘lodash';
const Component = React.createClass({
getInitialState() {
return {
data: { times: 0 }
}
},
handleAdd() {
let data = _.cloneDeep(this.state.data);
data.times = data.times + 1;
this.setState({ data: data });
// 如果上面不做 cloneDeep,下面打印的结果会是已经加 1 后的值。
console.log(this.state.data.times);
}
}
ログイン後にコピー

使用 Immutable 后:

getInitialState() {
 return {
  data: Map({ times: 0 })
 }
},
handleAdd() {
 this.setState({ data: this.state.data.update(‘times', v => v + 1) });
 // 这时的 times 并不会改变
 console.log(this.state.data.get(‘times'));
}
ログイン後にコピー

上面的 `handleAdd` 可以简写成:

handleAdd() {
 this.setState(({data}) => ({
 data: data.update(‘times', v => v + 1) })
});
}
ログイン後にコピー

2 . 与 Flux 搭配使用

由于 Flux 并没有限定 Store 中数据的类型,使用 Immutable 非常简单。

现在是实现一个类似带有添加和撤销功能的 Store:

import { Map, OrderedMap } from ‘immutable';
let todos = OrderedMap();
let history = []; // 普通数组,存放每次操作后产生的数据
let TodoStore = createStore({
 getAll() { return todos; }
});
Dispatcher.register(action => {
 if (action.actionType === ‘create') {
 let id = createGUID();
 history.push(todos); // 记录当前操作前的数据,便于撤销
 todos = todos.set(id, Map({
  id: id,
  complete: false,
  text: action.text.trim()
 }));
TodoStore.emitChange();
} else if (action.actionType === ‘undo') {
// 这里是撤销功能实现,
// 只需从 history 数组中取前一次 todos 即可
 if (history.length > 0) {
  todos = history.pop();
 }
 TodoStore.emitChange();
}
});
ログイン後にコピー

3 . 与 Redux 搭配使用

Redux 是目前流行的 Flux 衍生库。它简化了 Flux 中多个 Store 的概念,只有一个 Store,数据操作通过 Reducer 中实现;同时它提供更简洁和清晰的单向数据流(View -> Action -> Middleware -> Reducer),也更易于开发同构应用。目前已经在我们项目中大规模使用。

由于 Redux 中内置的 combineReducers 和 reducer 中的 initialState 都为原生的 Object 对象,所以不能和 Immutable 原生搭配使用。

幸运的是,Redux 并不排斥使用 Immutable,可以自己重写 combineReducers 或使用 redux-immutablejs 来提供支持。

上面我们提到 Cursor 可以方便检索和 update 层级比较深的数据,但因为 Redux 中已经有了 select 来做检索,Action 来更新数据,因此 Cursor 在这里就没有用武之地了。

总结

Immutable 可以给应用带来极大的性能提升,但是否使用还要看项目情况。由于侵入性较强,新项目引入比较容易,老项目迁移需要评估迁移。对于一些提供给外部使用的公共组件,最好不要把 Immutable 对象直接暴露在对外接口中。

如果 JS 原生 Immutable 类型会不会太美,被称为 React API 终结者的 Sebastian Markbåge 有一个这样的提案,能否通过现在还不确定。不过可以肯定的是 Immutable 会被越来越多的项目使用。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

怎样实现微信web端后退强制刷新

设置cookie过期自动更新和自动获取

以上がImmutableとReactの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

マグネットリンクの使い方 マグネットリンクの使い方 Feb 18, 2024 am 10:02 AM

マグネット リンクは、リソースをダウンロードするためのリンク方法であり、従来のダウンロード方法よりも便利で効率的です。マグネット リンクを使用すると、中間サーバーに依存せずに、ピアツーピア方式でリソースをダウンロードできます。この記事ではマグネットリンクの使い方と注意点を紹介します。 1. マグネット リンクとは? マグネット リンクは、P2P (Peer-to-Peer) プロトコルに基づくダウンロード方式です。ユーザーはマグネット リンクを通じてリソースの発行者に直接接続し、リソースの共有とダウンロードを完了できます。従来のダウンロード方法と比較して、磁気

mdfおよびmdsファイルの使用方法 mdfおよびmdsファイルの使用方法 Feb 19, 2024 pm 05:36 PM

mdf ファイルと mds ファイルの使用方法 コンピューター技術の継続的な進歩により、さまざまな方法でデータを保存および共有できるようになりました。デジタル メディアの分野では、特殊なファイル形式に遭遇することがよくあります。この記事では、一般的なファイル形式である mdf および mds ファイルについて説明し、その使用方法を紹介します。まず、mdf ファイルと mds ファイルの意味を理解する必要があります。 mdf は CD/DVD イメージ ファイルの拡張子で、mds ファイルは mdf ファイルのメタデータ ファイルです。

CrystalDiskmarkとはどのようなソフトウェアですか? -crystaldiskmarkの使い方は? CrystalDiskmarkとはどのようなソフトウェアですか? -crystaldiskmarkの使い方は? Mar 18, 2024 pm 02:58 PM

CrystalDiskMark は、シーケンシャルおよびランダムの読み取り/書き込み速度を迅速に測定する、ハード ドライブ用の小型 HDD ベンチマーク ツールです。次に、編集者が CrystalDiskMark と Crystaldiskmark の使用方法を紹介します。 1. CrystalDiskMark の概要 CrystalDiskMark は、機械式ハード ドライブとソリッド ステート ドライブ (SSD) の読み取りおよび書き込み速度とパフォーマンスを評価するために広く使用されているディスク パフォーマンス テスト ツールです。 ). ランダム I/O パフォーマンス。これは無料の Windows アプリケーションで、使いやすいインターフェイスとハード ドライブのパフォーマンスのさまざまな側面を評価するためのさまざまなテスト モードを提供し、ハードウェアのレビューで広く使用されています。

foob​​ar2000のダウンロード方法は? -foobar2000の使い方 foob​​ar2000のダウンロード方法は? -foobar2000の使い方 Mar 18, 2024 am 10:58 AM

foob​​ar2000 は、音楽リソースをいつでも聴くことができるソフトウェアです。あらゆる種類の音楽をロスレス音質で提供します。音楽プレーヤーの強化版により、より包括的で快適な音楽体験を得ることができます。その設計コンセプトは、高度なオーディオをコンピュータ上で再生可能 デバイスを携帯電話に移植し、より便利で効率的な音楽再生体験を提供 シンプルでわかりやすく、使いやすいインターフェースデザイン 過度な装飾や煩雑な操作を排除したミニマルなデザインスタイルを採用また、さまざまなスキンとテーマをサポートし、自分の好みに合わせて設定をカスタマイズし、複数のオーディオ形式の再生をサポートする専用の音楽プレーヤーを作成します。過度の音量による聴覚障害を避けるために、自分の聴覚の状態に合わせて調整してください。次は私がお手伝いさせてください

NetEase メールボックス マスターの使用方法 NetEase メールボックス マスターの使用方法 Mar 27, 2024 pm 05:32 PM

NetEase Mailbox は、中国のネットユーザーに広く使用されている電子メール アドレスとして、その安定した効率的なサービスで常にユーザーの信頼を獲得してきました。 NetEase Mailbox Master は、携帯電話ユーザー向けに特別に作成された電子メール ソフトウェアで、電子メールの送受信プロセスが大幅に簡素化され、電子メールの処理がより便利になります。 NetEase Mailbox Master の使い方と具体的な機能について、以下ではこのサイトの編集者が詳しく紹介しますので、お役に立てれば幸いです。まず、モバイル アプリ ストアで NetEase Mailbox Master アプリを検索してダウンロードします。 App Store または Baidu Mobile Assistant で「Ne​​tEase Mailbox Master」を検索し、画面の指示に従ってインストールします。ダウンロードとインストールが完了したら、NetEase の電子メール アカウントを開いてログインします。ログイン インターフェイスは次のとおりです。

Xiaoai スピーカーの使用方法 Xiaoai スピーカーを携帯電話に接続する方法 Xiaoai スピーカーの使用方法 Xiaoai スピーカーを携帯電話に接続する方法 Feb 22, 2024 pm 05:19 PM

スピーカーの再生ボタンを長押し後、ソフトウェア内でWi-Fiに接続すると使用可能になります。チュートリアル 該当するモデル: Xiaomi 12 システム: EMUI11.0 バージョン: Xiaoai Classmate 2.4.21 分析 1 まずスピーカーの再生ボタンを見つけ、長押ししてネットワーク配信モードに入ります。 2 携帯電話の Xiaoai Speaker ソフトウェアで Xiaomi アカウントにログインし、クリックして新しい Xiaoai Speaker を追加します。 3. Wi-Fi の名前とパスワードを入力した後、Xiao Ai に電話して使用することができます。補足: Xiaoai Speakerにはどのような機能がありますか? 1 Xiaoai Speakerには、システム機能、ソーシャル機能、エンターテイメント機能、ナレッジ機能、ライフ機能、スマートホーム、トレーニングプランがあります。概要/注意事項: 簡単に接続して使用するには、Xiao Ai アプリを事前に携帯電話にインストールしておく必要があります。

Baidu Netdisk アプリの使用方法 Baidu Netdisk アプリの使用方法 Mar 27, 2024 pm 06:46 PM

クラウド ストレージは今日、私たちの日常生活や仕事に欠かせない部分になっています。中国有数のクラウド ストレージ サービスの 1 つである Baidu Netdisk は、強力なストレージ機能、効率的な伝送速度、便利な操作体験により多くのユーザーの支持を得ています。また、重要なファイルのバックアップ、情報の共有、オンラインでのビデオの視聴、または音楽の聴きたい場合でも、Baidu Cloud Disk はニーズを満たすことができます。しかし、Baidu Netdisk アプリの具体的な使用方法を理解していないユーザーも多いため、このチュートリアルでは Baidu Netdisk アプリの使用方法を詳しく紹介します。まだ混乱しているユーザーは、この記事に従って詳細を学ぶことができます。 Baidu Cloud Network Disk の使用方法: 1. インストール まず、Baidu Cloud ソフトウェアをダウンロードしてインストールするときに、カスタム インストール オプションを選択してください。

PIP ミラー ソースの簡単なガイド: 使い方を簡単にマスターする PIP ミラー ソースの簡単なガイド: 使い方を簡単にマスターする Jan 16, 2024 am 10:18 AM

簡単に始めましょう: pip ミラー ソースの使用方法 世界中での Python の人気により、pip は Python パッケージ管理の標準ツールになりました。ただし、pip を使用してパッケージをインストールするときに多くの開発者が直面する一般的な問題は速度の遅さです。これは、デフォルトでは、pip は Python 公式ソースまたはその他の外部ソースからパッケージをダウンロードしますが、これらのソースが海外のサーバーに配置されている可能性があるため、ダウンロード速度が遅くなることがあります。ダウンロード速度を向上させるために、pip ミラー ソースを使用できます。ピップミラーソースとは何ですか?簡単に言えば、ただ、

See all articles