en
Feedback
ToCode

ToCode

Open in Telegram

讟讬驻讬诐 拽爪专讬诐 诇诪转讻谞转讬诐 诪讗转 讬谞讜谉 驻专拽

Show more
1 419
Subscribers
No data24 hours
No data7 days
-230 days
Posts Archive
ToCode
1 419
# 谞专讗讛 讻诪讜 拽讜诪驻讜谞谞讟讛 讛讛专讙诇 讛讘讗 讛讬讛 谞驻讜抓 讘注讜诇诐 讛拽诇讗住讬诐 讗讘诇 讗谞讞谞讜 注讚讬讬谉 专讜讗讬诐 讙诐 讘注讜诇诐 讛拽讜诪驻讜谞谞讟讜转 讛驻讜谞拽爪讬讜谞讗诇讬讜转 讜谞砖讗专 诪住讜讻谉 讘讗讜转讛 讛诪讬讚讛. 讗谞讬 诪讚讘专 注诇 驻讜谞拽爪讬讜转 砖诪讞讝讬专讜转 JSX 讗讘诇 讗讬谞谉 拽讜诪驻讜谞谞讟讜转, 诇讚讜讙诪讛:
function createBox(props) {
    const style = {
        display: 'inline-block',
        border: '1px solid',
        width: '80px',
        height: '80px',
        verticalAlign: 'top',
        ...props.style,
    };
    
    return (
        <div style={style} {...props} />
    );
}

function App() {
    return (
        <div>
            {_.range(10).map(() => createBox())}
        </div>
    );
}
讛驻讜谞拽爪讬讛 App 讛讬讗 讗讻谉 拽讜诪驻讜谞谞讟讛 讜诪讞讝讬专讛 诪注专讱 砖诇 10 div-讬诐 注诐 注讬爪讜讘 诪转讗讬诐. 讛驻讜谞拽爪讬讛 createDiv 讬讜转专 讘注讬讬转讬转: 讛讬讗 讗讬谞讛 拽讜诪驻讜谞谞讟讛 讗讘诇 讛讬讗 谞专讗讬转 拽爪转 讻诪讜 讜讛讬讗 诪住讘讻转 讗讜转谞讜 讻砖爪专讬讱 诇注砖讜转 Refactor. 讗诐 讘注转讬讚 谞爪讟专讱 诇砖诪讜专 住讟讬讬讟 讘转讜讱 讛拽讜驻住讗讜转 讛讗诇讛 讜谞专爪讛 诇讛讜住讬祝 拽专讬讗讛 诇 useState 诇转讜讱 讛驻讜谞拽爪讬讛, 讗讝 讛住讟讬讬讟 讬讬砖诪专 讘拽讜诪驻讜谞谞讟讛 砖拽讜专讗转 诇驻讜谞拽爪讬讛 讻诇讜诪专 讘 App. 讘讙诇诇 砖讛驻讜谞拽爪讬讛 诇讗 谞专讗讬转 讻诪讜 Custom Hook 拽诇 诇讛转讘诇讘诇 讜诇讛驻注讬诇 讗讜转讛 诪转讜讱 转谞讗讬 讗讜 诇讜诇讗讛 诪讛 砖讬讙专讜诐 诇转讜爪讗讜转 诇讗 爪驻讜讬讜转. 讞诇拽 诪讛讬讜驻讬 讘诪注讘专 诇拽讜诪驻讜谞谞讟讜转 驻讜谞拽爪讬讜谞讗诇讬讜转 讜诇 Hooks 讛讜讗 砖讛拽讜讚 砖诇 拽讜诪驻讜谞谞讟讛 驻讜谞拽爪讬讜谞讗诇讬转 讛讜讗 诇讗 讬讜转专 诪住讜讘讱 诪拽讜讚 砖诇 驻讜谞拽爪讬讛 驻砖讜讟讛. 讛讙讬专住讛 讛讘讗讛 砖诇 讗讜转讜 讛拽讜讚 转讛讬讛 讛专讘讛 讬讜转专 拽诇讛 诇转讞讝讜拽讛:
function Box(props) {
    const style = {
        display: 'inline-block',
        border: '1px solid',
        width: '80px',
        height: '80px',
        verticalAlign: 'top',
        ...props.style,
    };
    
    return (
        <div style={style} {...props} />
    );
}

function App() {
    return (
        <div>
            {_.range(10).map(() => <Box />)}
        </div>
    );
}

ToCode
1 419
            TextField(controller: minutesController, onChanged: (String newValue) {
              setTime(newValue, 60);
            }),
            Text("Hours: "),
            TextField(controller: hoursController, onChanged: (String newValue) {
              setTime(newValue, 3600);
            }),
          ],
        ),
      ),
    );
  }
}
谞砖讬诐 诇讘 诇驻专讟讬诐: 1. 拽讜讚 flutter 诪讜专讻讘 诪 Wdigets. 讘拽讜讚 讛讚讜讙诪讛 讬砖 讜讜讬讚讙'讟 专讗砖讬 讘砖诐 MyApp 讜讘转讜讻讜 讜讜讬讚讙'讟 诪砖谞讬 砖谞拽专讗 MyHomePage. 2. 讜讜讬讚讙'讟 讬讻讜诇 诇讛讬讜转 Stateless 讗讜 Stateful - 讻砖讛砖讗诇讛 讛讬讗 讛讗诐 讛讜讗 诪砖转谞讛 讘诪讛诇讱 专讬爪转 讛转讜讻谞讬转. 驻诇讗讟专 讬讚讗讙 诇注讚讻谉 讗转 讛诪诪砖拽 砖诇 Stateful Widget 讻诇 驻注诐 砖讛住讟讬讬讟 诪砖转谞讛. 3. 讛住讟讬讬讟 谞砖诪专 讘诪讞诇拽讛 谞驻专讚转 讜讛讜讗 讗讬驻讛 砖讻诇 讛诇讜讙讬拽讛 讬讜砖讘转. 讘诪注专讻转 讗诪讬转讬转 讘讟讞 讛讬讬转讬 砖讜诪专 讗讜转讜 讘拽讜讘抓 讗讞专, 讜讘讚讜讙诪讛 砖诇谞讜 讛拽诇讗住 谞拽专讗 _MyHomePageState. 4. 讘讙诇诇 砖讚讗专讟 讛讬讗 砖驻讛 诪讜谞讞讬转 注爪诪讬诐 讜讻诇 讛 API 砖诇 驻诇讗讟专 诪讘讜住住 注诇 诪讞诇拽讜转, 讙诐 讛住讟讬讬讟 讛讜讗 诪讞诇拽讛 讘注爪诪讜. 拽爪转 诪讘诇讘诇 砖诇 Stateless Widget 讬砖 驻讜谞拽爪讬讬转 build 砖讘讜谞讛 讗讜转讜, 讗讘诇 诇 Stateful Widget 讬砖 专拽 驻讜谞拽爪讬讬转 createStaet 讜诇住讟讬讬讟 砖诇讜 讬砖 驻讜谞拽爪讬讬转 build. 5. 谞讚诇讙 注诇 讛诪转讜讚讛 setTime 讜注诇 dispose 讻讚讬 诇讛讙讬讚 讻诪讛 诪讬诇讬诐 注诇 build: 讛驻讜谞拽爪讬讛 诪讞讝讬专讛 讗转 讛讬讬爪讜讙 砖诇 讛 Widget 讜转讬拽专讗 讻诇 驻注诐 砖讛住讟讬讬讟 讬砖转谞讛. 砖讬诪讜 诇讘 诇住讬讚讜专 砖诇 讛讬诇讚讬诐 讘转讜讱 讗讜讘讬拽讟 Column 诪讛 砖讗讜诪专 砖讻讜诇诐 讬讜驻讬注讜 讗讞讚 诪转讞转 诇砖谞讬. 讞讜抓 诪 Column 讬砖 注讜讚 讻诪讛 讚专讻讬诐 诇讗专讙谉 讜讜讬讚讙'讟讬诐 注诇 讛诪住讱 讜讝讛 讗讞讚 讛专注讬讜谞讜转 讛谞讞诪讚讬诐 砖诇 驻诇讗讟专 - 讻讬 讘注爪诐 讻诇 讛注讬爪讜讘 诪讜讘谞讛 讘转讜讱 讛拽讜讚. 6. 讛驻讜谞拽爪讬讛 讛讗谞讜谞讬诪讬转 砖注讜讘专转 讘转讜专 注专讱 砖诇 讛驻专诪讟专 onChanged 讘 TextField 转讬拽专讗 讻诇 驻注诐 砖诪砖转诪砖 诪注讚讻谉 讗转 讛砖讚讛. 讻诇 砖讚讛 诪砖转诪砖 讘 setTime 注诐 注专讱 讘住讬住 讗讞专 讜讝讛 诪讛 砖讙讜专诐 诇注讚讻讜谉 砖谞讬 讛砖讚讜转 讛讗讞专讬诐 讘讻诇 注讚讻讜谉. 讛诪砖转谞讛 讛砖谞讬 controller 讛讜讗 砖诪讗驻砖专 诇讬 诇砖谞讜转 讗转 讛注专讱 讘转讬讘讛 讘爪讜专讛 转讻谞讜转讬转. 7. 诇讗 诪拽讜讘诇 诇砖诪讜专 Reference 诇讗诇诪谞讟讬诐 注爪诪诐 砖讬爪专谞讜 讘转讜讱 讛 Build. 讛讚专讱 讛诪专讻讝讬转 诇转拽砖专 注诐 讛 Widgets 砖讗谞讞谞讜 讬讜爪专讬诐 讛讬讗 诇讛砖转诪砖 讘诪砖转谞讬 住讟讬讬讟 讻砖讬讜爪专讬诐 讗讜转诐 (讻讬 讗讝 build 讬讬拽专讗 砖讜讘 讻砖诪砖转谞讬诐 讗诇讜 讬转注讚讻谞讜). 讘诪拽专讛 砖诇 砖讚讜转 讟拽住讟 讝讛 讛拽讜谞讟专讜诇专. 8. 诇住讬讜诐 讛驻讜谞拽爪讬讛 setTime 砖注讜砖讛 讗转 讻诇 讛注讘讜讚讛 诪住驻专转 讬讜转专 注诇 Dart 诪讗砖专 注诇 驻诇讗讟专: 讛拽讜讚 讻讜诇讜 讘转讜讱 try/catch 讻讬 double.parse 注诇讜诇 诇讝专讜拽 Exception 讗诐 讛注专讱 诇讗 谞专讗讛 讻诪讜 诪住驻专; 诇讻诇 诪砖转谞讛 讬砖 讟讬驻讜住; 讘讞诇拽 诪讛诪拽讜诪讜转 讘拽讜讚 砖诇讬 讗驻砖专 讛讬讛 诇讜讜转专 注诇 讛诪讬诇讛 String 诇驻谞讬 诪砖转谞讛 讻讬 dart 讬讻讜诇 诇讛讘讬谉 讗转 讝讛 诇讘讚. 9. 诇诪专讜转 讻诇 诪讛 砖讗诪专转讬 注诇 住讟讬讬讟 讗谞讞谞讜 专讜讗讬诐 讻讗谉 讛砖诪讛 讬砖讬专讛 诇转讜讱 砖讚讛 诪讬讚注 讘拽讜谞讟专讜诇专 砖讙讜专诐 诇注讚讻讜谉 讛拽讜谞讟专讜诇专 讜讛驻注诇讛 诪讞讚砖 砖诇 讛 Build, 讻诇 讝讛 讘诇讬 诇注讘讜专 讚专讱 驻讜谞拽爪讬讬转 setState 砖诇 驻诇讗讟专. 讘讗讜驻谉 讻诇诇讬 讗谞讬 诪讜爪讗 讗转 讛 API 砖诇 驻诇讗讟专 拽爪转 诇讗 注拽讘讬 讗讘诇 讗讜诇讬 讬砖 诇讝讛 住讬讘讜转 讟讜讘讜转 砖驻砖讜讟 注讚讬讬谉 诇讗 讛讘谞转讬. 住讱 讛讻诇 讜诇诪专讜转 砖讛拽讜讚 注讜讘讚 讗谞讬 讞讬讬讘 诇讛讜讚讜转 砖注讘讜专 讗驻诇讬拽爪讬讬转 讛讚讜讙诪讛 砖讘讞专转讬 驻诇讗讟专 讜 dart 谞专讗讜 诇讬 诪住讜专讘诇讬诐 诪讚讬. 讛讛诪专讜转 讘讬谉 诪住驻专讬诐 诇诪讞专讜讝讜转 讜讛讟讬驻讜诇 讘 Exceptions 讛驻讻讜 讗转 讛拽讜讚 诇讬讜转专 讗专讜讱 诪诪讛 砖讗谞讬 专讙讬诇 诇专讗讜转 讘注讜诇诐 讛 Web. 诪爪讚 砖谞讬 讛讗驻诇讬拽爪讬讛 专爪讛 讘转讜专 Desktop App 注诇 讻诇 诪注专讻讜转 讛讛驻注诇讛 讜讘转讜专 Web App 讘讚驻讚驻谉. 拽讜讚 讛讗驻诇讬拽爪讬讛 讛诪诇讗 讝诪讬谉 讘讙讬讟讛讗讘 讘拽讬砖讜专: https://github.com/ynonp/hello-flutter-world.

ToCode
1 419
# 砖诇讜诐 Flutter World 注诐 讙讬专住讛 2 砖诇 驻诇讗讟专 讛讙讬注讛 讻谞讬住讛 诇注讜诇诐 讛 Desktop 讜砖讬转讜祝 驻注讜诇讛 注诐 拽谞讜谞讬拽诇 砖砖诐 讗转 驻诇讗讟专 讘转讜专 住讘讬讘转 讛驻讬转讜讞 讘专讬专转 讛诪讞讚诇 砖诇 Ubuntu. 驻诇讗讟专 讛驻讻讛 诇讗诇讟专谞讟讬讘讛 诪讛讬专讛 诇驻讬转讜讞 诪诪砖拽讬诐 注讘讜专 讗驻诇讬拽爪讬讜转 诪讜讘讬讬诇, 讜讜讘 讜 Desktop 讜讬讛讬讛 诪注谞讬讬谉 诇专讗讜转 注讚 讻诪讛 讛诪讛诇讱 讛讗讞专讜谉 讘讗诪转 讬砖驻讬注 注诇 诪转讻谞转讬诐 诇讘讞讜专 讘讛. 讘砖讘讬诇 诇讛拽诇 注诇讬讻诐 讗转 讛讻谞讬住讛 (讗讜 讛讛转诇讘讟讜转 讗诐 讻讚讗讬) 讛谞讛 住讬讜专 讝专讬讝 讘驻诇讗讟专 讚专讱 驻讬转讜讞 讗驻诇讬拽爪讬讛 诇讗 诪住讜讘讻转. ## 讛转拽谞讜转 讜讻讜 讛讜专讗讜转 讛转拽谞讛 诪驻讜专讟讜转 谞诪爪讗讜转 讘讗转专 砖诇讛诐. 诪讻诇 讛诪注专讻讜转 讛讛转拽谞讛 讛讻讬 拽诇讛 讛讬讗 讚讜讜拽讗 注诇 诇讬谞讜拽住 - 讬砖 驻砖讜讟 拽讜讘抓 snap 诇讛转拽谞讛, 讗讘诇 讙诐 注诇 讞诇讜谞讜转 讜诪拽 讛讛转拽谞讛 诇讗 讗诪讜专讛 诇拽讞转 讬讜转专 诪讻诪讛 讚拽讜转 砖诇 讛注转拽转 砖讜专讜转 诪讛诪讚专讬讱. 讻讗谉 谞诪爪讗讬诐 诪讚专讬讻讬 讛讛转拽谞讛 诇讻诇 砖诇讜砖转 诪注专讻讜转 讛讛驻注诇讛: https://flutter.dev/docs/get-started/install. 讗讞专讬 讝讛 讬砖 讙诐 讚祝 砖诪住讘讬专 讗讬讱 诇拽谞驻讙 讗转 注讜专讱 讛讟拽住讟 诇-4 注讜专讻讬诐 驻讜驻讜诇专讬讬诐 (讗讬诪拽住, VS Code, IntelliJ 讜 Android Studio): https://flutter.dev/docs/get-started/editor?tab=vscode 讜注诐 拽爪转 注讝专讛 诪讙讜讙诇 转诪爪讗讜 讘拽诇讜转 讛讜专讗讜转 讛转拽谞讛 诇讻诇 注讜专讱 讟拽住讟 讗讞专 砖讗转诐 讗讜讛讘讬诐. 讗讞专讬 讛讛转拽谞讛 驻诇讗讟专 诪讙讬注讛 注诐 Project Generator 讜讘砖讘讬诇 诇讬爪讜专 转讘谞讬转 砖诇 驻专讜讬拽讟 讞讚砖 谞讻谞住讬诐 诇转讬拽讬讛 专讬拽讛 讜诪驻注讬诇讬诐:
$ flutter create .
## 诪讘谞讛 讛转讜讻谞讬转 讬爪专谉 讛驻专讜讬拽讟讬诐 讘谞讛 诇谞讜 转讬拽讬讛 住驻爪讬驻讬转 诇讻诇 诪注专讻转 讛驻注诇讛 (注诐 讛砖诪讜转 android, ios, linux, macos, windows 讜 web) 讜转讬拽讬讛 讘砖诐 lib 讘讛 谞诪爪讗 讛拽讜讚 讛诪砖讜转祝. 讘转讜讱 讛转讬拽讬讜转 讛住驻爪讬驻讬讜转 谞讻转讜讘 拽讜讚 住驻爪讬驻讬 诇讻诇 诪注专讻转 讛驻注诇讛 - 诇讚讜讙诪讛 拽讜讚 砖讞讜砖祝 讗讬讝砖讛讜 Native API, 讜讘转讜讱 转讬拽讬讬转 lib 讬讛讬讛 讛拽讜讚 讛诪砖讜转祝 诇讻诇 讛诪注专讻讜转. 讘砖讘讬诇 讛讚讜讙诪讛 讗谞讬 专讜爪讛 诇讘谞讜转 讗驻诇讬拽爪讬讬转 Desktop 驻砖讜讟讛 诇讛诪专转 讬讞讬讚讜转 讝诪谉: 讛讗驻诇讬拽爪讬讛 诪专讗讛 3 转讬讘讜转 讟拽住讟, 讗讞转 讘砖讘讬诇 砖谞讬讜转, 讛砖谞讬讛 讘砖讘讬诇 讛讚拽讜转 讜讛砖诇讬砖讬转 讘砖讘讬诇 讛砖注讜转. 砖讬谞讜讬 讛注专讱 讘讻诇 转讬讘讛 讬讙专讜诐 诇注讚讻讜谉 讛注专讱 讘砖转讬 讛转讬讘讜转 讛讗讞专讜转 讘讛转讗诪讛. 讻诇讜诪专 讗诐 讻转讘转讬 7200 讘转讬讘转 讛砖谞讬讜转 讬讜驻讬注 诇讬 2 讘转讬讘转 讛砖注讜转 讜 120 讘转讬讘转 讛讚拽讜转. 讗诐 讻转讘转讬 1 讘转讬讘转 讛砖注讜转 讗讜讟讜诪讟讬转 讬讜驻讬注 3600 讘转讬讘转 讛砖谞讬讜转 讜 60 讘转讬讘转 讛讚拽讜转. 讻诇 讛拽讜讚 讛专诇讜讜谞讟讬 谞讻谞住 讘 90 砖讜专讜转 讘拽讜讘抓 lib/main.dart. 讛谞讛 讛讚讘拽讛 砖诇讜 讜讗讞专 讻讱 讻诪讛 讛注专讜转 砖讬注讝专讜 诇讛讘谞讛:
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final secondsController = TextEditingController();
  final minutesController = TextEditingController();
  final hoursController = TextEditingController();

  setTime(String value, int factor) {
    try {
      double seconds = double.parse(value) * factor;
      String secondsText = seconds.toStringAsFixed(2);
      String hoursText = (seconds / 3600).toStringAsFixed(2);
      String minutesText = (seconds / 60).toStringAsFixed(2);

      if (factor != 1) {
        secondsController.text = secondsText;
      }

      if (factor != 60) {
        minutesController.text = minutesText;
      }

      if (factor != 3600) {
        hoursController.text = hoursText;
      }
    } on FormatException { }
  }

  @override
  void dispose() {
      secondsController.dispose();
      minutesController.dispose();
      hoursController.dispose();
      super.dispose();
    }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text("Seconds: "),
            TextField(controller: secondsController, onChanged: (String newValue) {
              setTime(newValue, 1);
            }),
            Text("Minutes: "),

ToCode
1 419
# 讟讬驻 讜讬诐: 讛砖诇诪讛 讗讜讟讜诪讟讬转 注诐 CoC 讻谉 讗谞讬 讬讜讚注 砖讛砖诇诪讛 讗讜讟讜诪讟讬转 专拽 驻讜讙注转 诇谞讜 讘讝讬讻专讜谉 讜诪转讻谞转讬诐 讗诪讬转讬讬诐 讻讜转讘讬诐 讘诇讬 爪讘注讬诐 讜讘诇讬 讛砖诇诪讜转, 讗讘诇 讗诐 讘讻诇 讝讗转 讗转诐 诪专讙讬砖讬诐 爪讜专讱 诇讛转驻谞拽 讗讜 注讜讘讚讬诐 注诐 砖驻转 转讻谞讜转 讞讚砖讛 讜专讜爪讬诐 诇拽爪专 讝诪谞讬诐 讬砖 砖转讬 住讬讘讜转 砖讙讜专诪讜转 诇 coc.vim 诇注讘讜讚 讬讜转专 讟讜讘 诪讻诇 驻诇讗讙讬谉 讗讞专 砖谞讬住讬转讬. 讛住讬讘讛 讛专讗砖讜谞讛 讛讬讗 谞讬爪讜诇 讛讬讻讜诇转 讛讗住讬谞讻专讜谞讬转 砖诇 讜讬诐8 讗讜 谞讬讗讜-讜讬诐 讻讚讬 诇住驻拽 诪谞讙谞讜谉 讛砖诇诪讛 讗讜讟讜诪讟讬转 砖诇讗 诪讗讟 讘讻诇诇 讗转 讛注讜专讱 讜诇讗 注讜爪专 "诇讞砖讜讘" 讘讗诪爪注 砖讻讜转讘讬诐 拽讜讚. 讻谉 讬砖 讬讜转专 注讜诪住 注诇 讛讝讬讻专讜谉 讜讝讛 讘讙诇诇 讛住讬讘讛 讛砖谞讬讛. 讛住讬讘讛 讛砖谞讬讛 讛讬讗 诪谞讙谞讜谉 砖谞拽专讗 Language Server Protocol 讗讜 讘拽讬爪讜专 lsp. 讛专注讬讜谉 讛讜讗 诇讬爪讜专 诪谞讙谞讜谉 住讟谞讚专讟讬 砖诇 讛砖诇诪讛 讗讜讟讜诪讟讬转 诇注讜专讻讬 讟拽住讟 讻讱 砖"砖专转" 讛讛砖诇诪讛 讛讗讜讟讜诪讟讬转 讬讛讬讛 讞讬爪讜谞讬 诇注讜专讱 讜砖谞讬 讛专讻讬讘讬诐 讬转拽砖专讜 讘讗诪爪注讜转 驻专讜讟讜拽讜诇 讛讜讚注讜转. coc 诪转拽砖专 注诐 砖专转 砖驻讜转 讻讚讬 诇讛爪讬注 讗转 讛讛砖诇诪讛 讛讗讜讟讜诪讟讬转 讗讝 讗诐 讬砖 诇谞讜 砖专转 砖驻讜转 讟讜讘 讜诪转讜讞讝拽 讙诐 讛爪注讜转 讛讛砖诇诪讛 讬讛讬讜 讟讜讘讜转. 讛专爪转 砖专转 砖驻讜转 诪转讜讱 讛注讜专讱 诇讜拽讞转 讝讬讻专讜谉 讜诇驻讞讜转 讗爪诇讬 注诇 讛诪讻讜谞讛 爪专讬讻转 讛讝讬讻专讜谉 砖诇 vim 讛讬转讛 讙讘讜讛讛 诪砖诪注讜转讬转 讻砖讛讜住驻转讬 讗转 coc 讘讞诇拽 诪讛砖驻讜转. 讘讚祝 讛讝讛 讬砖 专砖讬诪转 砖诇 讻诇 砖专转讬 讛砖驻讜转 讛讬讚讜注讬诐 诇讗讚诐: https://microsoft.github.io/language-server-protocol/implementors/servers/. 讘砖驻讜转 砖谞讬住讬转讬 讘讬谞转讬讬诐 讛讛砖诇诪讛 讛讬转讛 诪讚讜讬拽转 讜诪讛讬专讛 讜诇讻谉 讗诐 讗转诐 讘注谞讬讬谉 讛砖诇诪讜转 讗讜讟讜诪讟讬讜转 讗谞讬 诪讗讜讚 诪诪诇讬抓 诇讛转拽讬谉 讗转 讛转讜住祝. 讛讜专讗讜转 讛转拽谞讛 转诪爪讗讜 讘讚祝 讛转讜住祝 讻讗谉: https://github.com/neoclide/coc.nvim. 讗讞专讬 讛讛转拽谞讛 讬砖 诇讛驻注讬诇 诪转讜讱 vim 驻拽讜讚讜转 诇讛转拽谞转 砖专转 讛砖驻讜转 (讗讜 砖专转讬 讛砖驻讜转) 砖讗转诐 爪专讬讻讬诐, 诇诪砖诇 讘砖讘讬诇 诇注讘讜讚 注诐 typescript 讛讬讬转讬 爪专讬讱 诇讛驻注讬诇 诪转讜讱 讜讬诐 讗转:
:CocInstall coc-tsserver
讜讗诇讛 讛砖讜专讜转 砖讛讜住驻转讬 诇 vimrc 讻讚讬 诇拽讘诇 讛转谞讛讙讜转 讬讜转专 讗讬谞讟讜讗讬讟讬讘讬转:
let g:lsc_auto_map = v:true

nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

inoremap <silent><expr> <c-@> coc#refresh()
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
                              \: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

" Use K to show documentation in preview window.
nnoremap <silent> K :call <SID>show_documentation()<CR>

function! s:show_documentation()
  if (index(['vim','help'], &filetype) >= 0)
    execute 'h '.expand('<cword>')
  elseif (coc#rpc#ready())
    call CocActionAsync('doHover')
  else
    execute '!' . &keywordprg . " " . expand('<cword>')
  endif
endfunction

" Symbol renaming.
nmap <leader>rn <Plug>(coc-rename)

" Formatting selected code.
xmap <leader>f  <Plug>(coc-format-selected)
nmap <leader>f  <Plug>(coc-format-selected)

" Add `:Format` command to format current buffer.
command! -nargs=0 Format :call CocAction('format')

ToCode
1 419
# 讘讗讙 专讬驻讜专讟: 诪讞讬拽讛 诪专讜讘讛 讜讞讬驻讜砖 驻注诪讬讬诐 讘转拽讜驻讛 讛讗讞专讜谞讛 谞转拽诇转讬 讘讗讜转讜 讘讗讙 讘砖转讬 诪注专讻讜转 砖讜谞讜转 讜讘砖谞讬 讛诪拽专讬诐 注诐 转讜爪讗讛 讛专住谞讬转, 讜讝讛 诇讘讚 诪爪讚讬拽 驻讜住讟 拽讟谉 讘转拽讜讜讛 砖讬注讝讜专 讙诐 诇讻谉 诇讛讬诪谞注 诪讘注讬讜转 讚讜诪讜转. ## 诪讛 拽专讛 讘诪住讱 专砖讬诪转 驻专讬讟讬诐 讘诪注专讻转 讛讬转讛 诇谞讜 转讬讘转 讞讬驻讜砖 讜讙诐 讗驻砖专讜转 诇讘讬爪讜注 驻注讜诇讛 (诇诪砖诇 诪讞讬拽讛) 注诇 讻诇 讛驻专讬讟讬诐. 讘注讝专转 转讬讘转 讛讞讬驻讜砖 诪砖转诪砖讬诐 讬讻诇讜 诇拽讘诇 专拽 驻专讬讟讬诐 砖诪转讗讬诪讬诐 诇诪讬诇转 讞讬驻讜砖 诪住讜讬诪转. 讘专讙注 砖诪砖转诪砖 住讬谞谉 讞诇拽 诪讛驻专讬讟讬诐 讘转讬讘转 讛讞讬驻讜砖 讜讗讝 诇讞抓 "讘讞专 讛讻诇" 诇爪讜专讱 讘讬爪讜注 驻注讜诇讛 注诇 讻诇 讛驻专讬讟讬诐 讘转讜爪讗讜转 讛讞讬驻讜砖, 讛诪注专讻转 "砖讻讞讛" 砖讗谞讞谞讜 讘转讜讱 讞讬驻讜砖 讜讘讬爪注讛 讗转 讛驻注讜诇讛 注诇 讻诇 讛驻专讬讟讬诐. ## 诇诪讛 讝讛 拽专讛 讘砖讘讬诇 诇诪诪砖 讘讬爪讜注 驻注讜诇讛 注诇 诪住驻专 驻专讬讟讬诐 诪专砖讬诪讛, 讗诐 讻诇 讛驻专讬讟讬诐 诪讜驻讬注讬诐 讘拽诇讗讬讬谞讟, 讗驻砖专 诇砖诇讜讞 诇砖专转 讗转 专砖讬诪转 讻诇 讛驻专讬讟讬诐 (讗讜 诪讝讛讬 讛驻专讬讟讬诐) 注诇讬讛诐 专讜爪讬诐 诇讘爪注 讗转 讛驻注讜诇讛. 讘诪拽专讛 砖诇谞讜, 讜讘讚讜诪讛 诇诪诪砖拽 讘讙'讬诪讬讬诇 讜讘诪注专讻讜转 谞讜住驻讜转, 讛专砖讬诪讛 讻讜诇诇转 讛诪讜谉 讛诪讜谉 驻专讬讟讬诐 诪讞讜诇拽讬诐 诇注诪讜讚讬诐. 讗驻砖专讜转 "讘讞专 讛讻诇" 讗诪讜专讛 诇住诪谉 讗转 讻诇 讛驻专讬讟讬诐 诪讻诇 讛讚驻讬诐, 讻讜诇诇 讗诇讛 砖注讻砖讬讜 讗讬谉 注诇讬讛诐 诪讬讚注 讘拽诇讗讬讬谞讟. 讛驻讬转专讜谉 砖谞讘讞专 讛讬讛 诇砖诇讜讞 驻专诪讟专 诪讬讜讞讚 砖诪爪讬讬谉 砖讛驻注讜诇讛 砖讗谞讞谞讜 诪讘爪注讬诐 爪专讬讻讛 诇专讜抓 注诇 讻诇 讛驻专讬讟讬诐 讻讜诇诇 讗诇讛 砖讛拽诇讗讬讬谞讟 诇讗 专讜讗讛 讻专讙注 讻讬 讛诐 谞诪爪讗讬诐 讘讚驻讬诐 讗讞专讬诐. 讛讘注讬讛 砖诇讗 讛讬讛 转讬讗讜诐 讘讬谉 驻专诪讟专 讝讛 诇讘讬谉 驻专诪讟专 讛讞讬驻讜砖: 讘拽砖讛 讗讞转 住讬谞谞讛 讗转 讛驻专讬讟讬诐 诇驻讬 诪讬诇转 讞讬驻讜砖 诪住讜讬诪转, 讜讘拽砖讛 讗讞专讬讛 讘讬爪注讛 "诪讞讬拽讛 诪专讜讘讛" 讜诪讞拽讛 讗转 讻诇 讛驻专讬讟讬诐, 讘诇讬 砖讛砖专转 讬讜讻诇 诇讛讘讬谉 砖"讻诇 讛驻专讬讟讬诐" 讗诪讜专讬诐 讛讬讜 诇讛讬讜转 专拽 "讻诇 讛驻专讬讟讬诐 砖诪转讗讬诪讬诐 诇讞讬驻讜砖". ## 讗讬讱 讻讚讗讬 诇诪谞讜注 讘注讬讜转 讚讜诪讜转 讘注转讬讚 讛诪拽讜专 讛讗诪讬转讬 诇讘注讬讛 讛讜讗 诪讬诪讜砖 诇讗 谞讻讜谉 砖诇 诪谞讙谞讜谉 讛讞讬驻讜砖. 讗诐 谞讬拽讞 讚讜讙诪讛 诪 Rails 讗驻砖专 诇讚诪讬讬谉 拽讜谞讟专讜诇专 讘砖诐 ItemsController 注诐 驻注讜诇转 index 砖诪爪讬讙讛 讗转 讻诇 讛驻专讬讟讬诐 讜诪讟驻诇转 讘讞讬驻讜砖:
class ItemsController < ApplicationController
    def index
        @items = Item.where(owner: current_user)
        if params[:search]
            @items = @items.where("name like '%?%'", params[:search])
        end
    end
end
讜驻讛 讛讘注讬讛 - 讞讬驻讜砖 讛讜讗 诇讗 "注讜讚 讚专讱" 诇讛爪讬讙 转讜爪讗讜转 讗诇讗 讛讜讗 砖讬谞讜讬 Context, 讛讜讗 诪诪砖 诪砖驻讬注 注诇 讻诇 讛驻注讜诇讜转 注诇 讛诪住讱 砖注讻砖讬讜 爪专讬讻讜转 诇讛讬讜转 诪讜砖驻注讜转 诪专砖讬诪转 讛转讜爪讗讜转. 讙讬砖讛 讟讜讘讛 讬讜转专 诇讻转讬讘转 拽讜讚 讛讞讬驻讜砖 讛讬讗 诇讘谞讜转 讗讜转讜 讘转讜专 Controller 谞驻专讚 注诐 驻注讜诇转 index 诪砖诇讜:
class ItemsController < ApplicationController
    def index
        @items = Item.where(owner: current_user)
    end
end

class ItemsSearchController < ApplicationController
    def index
        @items = Item.where(owner: current_user).where("name like '%?%'", params[:search])
    end
end
讘讙讬砖讛 讻讝讗转 讻诇 讛讻驻转讜专讬诐 讘 View 讬讻讜诇讬诐 诇砖诇讜讞 讗讜转谞讜 诇 Actions 诪转讗讬诪讬诐 讘 Controller 砖诇讛诐, 讜讗讝 讻驻转讜专 砖诇 Delete All 讛讬讛 诪讙讬注 诇 ItemsSearchController#delete_all 讜讝讜专拽 砖讙讬讗讛 讻讬 讛驻注讜诇讛 诇讗 诪讜诪砖讛 注讚讬讬谉, 讘诪拽讜诐 诇诪讞讜拽 讗转 讻诇 讛驻专讬讟讬诐 讘诇讬 拽砖专 诇转讜爪讗讜转 讛讞讬驻讜砖.

ToCode
1 419
# 砖讘注 讛诪砖讬诪讜转 讛讘讗讜转 讗讬讱 诇诇诪讜讚 Java? 讗讬讱 诪转讞讬诇讬诐 诇诇诪讜讚 React? 讗讬讱 讗谞讬 讛讜驻讱 诇诪转讻谞转 Node.JS? 讗讬讱 讗谞讬 诇讜诪讚 诇讛讬讜转 诪转讻谞转 讗讜讟讜诪爪讬讛? 讻诇 砖讗诇讛 讻讗谉 讛讬讗 砖讗诇讛 注谞拽讬转 讻讬 讛讬讗 诪住转讻诇转 注诇 讬注讚 专讞讜拽 砖讬砖 讛诪讜谉 讚专讻讬诐 诇讛讙讬注 讗诇讬讜, 讜注诇 讻讝讛 砖讗讬谉 诪住诇讜诇 讘专讜专 讗诇讬讜. 讗诐 讗谞讬 诪讞诇讬讟 诇拽讞转 讗转 "讗讬讱 讘转讜专 讘讜讚拽 讬讚谞讬 讗谞讬 注讜讘专 诇诇诪讜讚 诇讻转讜讘 讘讚讬拽讜转 讗讜讟讜诪爪讬讛 诇诪注专讻讜转 讜讜讘" 讘转讜专 讚讜讙诪讛, 讗谞讬 诪讙诇讛 砖讗谞讬 爪专讬讱: 1. 诇诇诪讜讚 讗讬讱 讘谞讜讬讛 讗驻诇讬拽爪讬讬转 Web (讻讜诇诇 HTML, CSS 讜拽爪转 JavaScript) 2. 诇诇诪讜讚 讗讬讱 注讜讘讚 拽讜讚 爪讚 砖专转 讜诪讛 讛拽砖专 讘讬谉 Front End 诇 Back End 3. 诇诇诪讜讚 注诇 驻专讜讟讜拽讜诇讬 转拽砖讜专转 讜讘诪讬讜讞讚 HTTP 4. 诇诇诪讜讚 砖驻转 转讻谞讜转 讻诇砖讛讬 讗讬转讛 讗讻转讜讘 讗转 讛讘讚讬拽讜转 5. 诇诇诪讜讚 讗讬讱 诇讛砖转诪砖 讘 Selenium 讜诇讻转讜讘 讘讚讬拽讜转 讘砖驻转 讛转讻谞讜转 砖讘讞专转讬 讜讻诇 住注讬祝 驻讛 讘专砖讬诪讛 谞驻转讞 诇转转 专砖讬诪讛 谞驻专讚转 诪砖诇讜 - 讜讛讻讬 讙专讜注, 讛讗讜专讱 砖诇 讻诇 专砖讬诪讛 诪砖转谞讛 诇驻讬 讛讚讘专讬诐 砖讗谞讬 讛讬讜诐 讬讜讚注 讜讛讝诪谉 砖讬砖 诇讬. 讗讝 讘讚讜讙诪讛 砖诇 讘讚讬拽讜转 讗讜讟讜诪讟讬讜转 讬讻讜诇 诇讛讬讜转 砖讗谞讬 讗爪讟专讱 诇讛砖拽讬注 讬讜转专 讝诪谉 讘讛讻专转 讛诪讘谞讛 砖诇 Web Applications, 讜诪讬砖讛讜 讗讞专 讬爪讟专讱 诇讛砖拽讬注 讗转 注讬拽专 讛讝诪谉 讘诇讬诪讜讚 Python 讜诪讬砖讛讜 砖诇讬砖讬 讘讻诇诇 讬住转讘讱 注诐 讛 Selenium. 讚专讱 讟讜讘讛 诇讛转讞讬诇 诇诇诪讜讚 谞讜砖讗 讞讚砖 讛讬讗 诇讗 诇讛住转讻诇 注诇 讛谞讜砖讗讬诐 讗诇讗 诇讘谞讜转 专砖讬诪讛 (讗讜 诇诪爪讜讗 专砖讬诪讛 诪讜讻谞讛 讗讜 诇讛讬注讝专 讘讞讘专 诇爪讜专讱 讛讘谞讬讛) 砖诪讻讬诇讛 7 诪讟诇讜转 住驻爪讬驻讬讜转 砖讬拽讚诪讜 讗转讻诐 诇讬注讚. 讚讘专讬诐 讻诪讜- 1. 诇讻转讜讘 讜诇讛专讬抓 转讜讻谞讬转 Hello World 讘砖驻转 驻讬讬转讜谉. 2. 诇讻转讜讘 转讜讻谞讬转 讘砖驻转 Python 砖诪讚驻讬住讛 讗转 讻诇 讛诪住驻专讬诐 讛讝讜讙讬讬诐. 3. 诇讻转讜讘 讚祝 讗讬谞讟专谞讟 砖诪爪讬讙 诪讬讚注 注诇讬讬. 4. 诇讻转讜讘 转讜讻谞讬转 驻讬讬转讜谉 砖诪讜砖讻转 诪讬讚注 诪砖专转 诪专讜讞拽. 5. 诇讻转讜讘 转讜讻谞讬转 驻讬讬转讜谉 砖诪驻注讬诇讛 讚驻讚驻谉 讜讘讜讚拽转 诪讛 讛讟拽住讟 砖诪讜驻讬注 讘讻讜转专转 砖诇 讛讚祝. 6. 诇讛专讬抓 讗转 讛转讜讻谞讬转 砖讻转讘转讬 讘爪讜专讛 讗讜讟讜诪讟讬转 讘转讜专 诪砖讬诪讛 诪转讜讝诪谞转. 7. 诇拽讘诇 讗讬诪讬讬诇 诪讛转讜讻谞讬转 讘住讜祝 讛讛专爪讛 讗诐 讛讟拽住讟 讛讜讗 诇讗 诪讛 砖讞砖讘转讬. 讗诇讛 7 诪砖讬诪讜转 砖讘转讜专 讗讬砖 QA 讗谞讬 讬讻讜诇 诇讛讘讬谉 讘讻诇 诪砖讬诪讛 讘讚讬讜拽 诪讛 讗谞讬 爪专讬讱 讜讛谉 谞讜转谞讜转 诇讬 诪砖讛讜 诇讛转注住拽 讗讬转讜 讘砖讘讜注 讛拽专讜讘. 住讬讻讜讬 讟讜讘 砖讗爪诇讬讞 诇讘爪注 讞诇拽 诪讛诪砖讬诪讜转 砖讘讞专转讬, 讜讻诪注讟 讘讟讜讞 砖讬讛讬讜 讻讗谉 诪砖讬诪讜转 "讙讚讜诇讜转" 注诇讬讬, 讻诇讜诪专 讚讘专讬诐 砖讞砖讘转讬 砖讗谞讬 讬讻讜诇 诇注砖讜转 讗讘诇 讗讝 讗谞讬 讘讗 诇讻转讜讘 讗讜转诐 讜诪讙诇讛 砖讛诐 讛专讘讛 讬讜转专 诪住讜讘讻讬诐. 讝讛 讘住讚专 讙诪讜专. 诪讛 砖讞砖讜讘 讝讛 砖讘住讜祝 讛注讘讜讚讛 注诇 讛专砖讬诪讛 讬讛讬讛 诇讬 诪住驻讬拽 讞讜诪专 诇诪讞砖讘讛 诇专砖讬诪转 砖讘注 讛诪砖讬诪讜转 讛讘讗讜转. 讻砖讘讜讞专讬诐 讬注讚 专讞讜拽 讗讬 讗驻砖专 诇专讗讜转 讗转 住讜祝 讛讚专讱 - 讗谞讞谞讜 专讜讗讬诐 专拽 注讚 讻诪讛 砖讛驻谞住 砖诇谞讜 诪讙讬注. 讻讻诇 砖谞转拽讚诐 讬讜转专 注诪讜拽 诇转讜讱 讛诪注专讛 谞讜讻诇 诇专讗讜转 讬讜转专 讚讘专讬诐 讜诇诪爪讜讗 专砖讬诪讜转 讬讜转专 诪注谞讬讬谞讜转. 讜讻谉, 讘住讜祝 讙诐 诇诇诪讜讚 讗转 讛讚讘专 讛讛讜讗 砖讘讙诇诇讜 谞讻谞住谞讜 诇诪注专讛, 讗诐 讛讜讗 注讚讬讬谉 讬讛讬讛 诪注谞讬讬谉 讘注讜讚 砖诇讜砖讛 讗讜 讗专讘注讛 讞讜讚砖讬诐.

ToCode
1 419
# 讛住讜讚 讛讻讬 砖诪讜专 讘讛讬讬讟拽 讬砖 诇讬 讞讘专 砖注讜讘讚 讻讘专 砖谞讬诐 讘讛讬讬讟拽 讜注讚 诇讗讞专讜谞讛 转诪讬讚 讛讬讛 诪讗讜讚 诪转讜住讻诇: 讛讜讗 讗讞讚 讛诪转讻谞转讬诐 讛诪讛讬专讬诐 砖驻讙砖转讬 讜讘注讬拽专讜谉 讛讬讛 讬讻讜诇 诇住讬讬诐 讻诇 讬讜诐 注讘讜讚讛 讘讞爪讬 诪讛讝诪谉 砖诇 讬讜诐 注讘讜讚讛 专讙讬诇, 讗讘诇 "讘砖讘讬诇 诪讛?" 讛讜讗 讗讜诪专 诇讬 诪讚讬 驻注诐, "讛讬讬转 爪专讬讱 诇专讗讜转 讗讬讱 诪住转讻诇讬诐 注诇讬讬 讗诐 讗谞讬 诪注讝 讬讜诐 讗讞讚 诇爪讗转 拽讜讚诐". 讜讞讘专讛 讗讞专转 砖诪讛 诇讘 砖诇讗 诪砖谞讛 诪讛 讛讬讗 注讜砖讛 讛讬讗 讗祝 驻注诐 诇讗 诪爪诇讬讞讛 诇注诪讜讚 讘讝诪谞讬诐. 讝讛 谞专讗讛 讻讗讬诇讜 转诪讬讚 讬砖 讬讜转专 注讘讜讚讛 诪诪讛 砖讛讬讗 诪住驻讬拽讛 诇注砖讜转, 诇讗 诪砖谞讛 讻诪讛 讛讬讗 诪转讗诪爪转. 讬讜诪讬讬诐 讘砖讘讜注 讛讬讗 谞砖讗专转 诇注讘讜讚 诇转讜讱 讛诇讬诇讛 诇专讜拽谉 讗转 讛注专讬诪讛, 讜诇诪讞专转 专砖讬诪转 讛诪砖讬诪讜转 讻讗讬诇讜 诪转诪诇讗转 诪注爪诪讛. 诇诪专讜转 砖砖谞讬 讛诪拽专讬诐 谞专讗讬诐 讛驻讜讻讬诐, 诇砖谞讬 讛讞讘专讬诐 砖诇讬 讬砖 讘注讬讛 讚讜诪讛 - 砖谞讬讛诐 诪专讙讬砖讬诐 砖讗讬谉 诇讛诐 砖诇讬讟讛 注诇 讛讝诪谉 砖诇讛诐. 砖谞讬讛诐 "诇讗 讬讻讜诇讬诐" 诇拽讞转 砖注讛 讘讬讜诐 诇诇诪讜讚 讟讻谞讜诇讜讙讬讜转 讞讚砖讜转 讻讬 讛讘讜住 诪讞诇讬讟 诪讛 诪讜转专 讜诪讛 讗住讜专. 讜讛住讜讚? 诪住转讘专 砖讘转拽讜驻转 讛拽讜专讜谞讛 砖谞讬讛诐 讙讬诇讜 砖讬砖 诇讛诐 讛专讘讛 讬讜转专 砖诇讬讟讛 诪诪讛 砖讛诐 讞砖讘讜, 讜讻谞专讗讛 转诪讬讚 讛讬转讛. 讛讞讘专 砖注讜讘讚 诪讛专 诇诪讚 诇谞爪诇 讗转 讛讝诪谉 砖讛讜讗 诪专讜讜讬讞, 讜讛讞讘专讛 砖注讜讘讚转 诇讗讟 诇诪讚讛 诇讛转注诇诐 诪讞诇拽 诪讛讛讜讚注讜转 讛谞讻谞住讜转. 砖谞讬讛诐 讘讬诇讜 讘砖谞讛 讛讗讞专讜谞讛 讛专讘讛 讬讜转专 讝诪谉 注诐 讛诪砖驻讞讛 诪诪讛 砖讗讬 驻注诐 讞砖讘讜 砖讗驻砖专讬. 讘讜讗讜 诇讗 谞讬转谉 诇住讜讚 讛讝讛 诇讛讬砖讻讞- 讙诐 讻砖讗谞讞谞讜 诪转拽专讘讬诐 诇讞讝专讛 诇诪砖专讚 诇驻讞讜转 诇讞诇拽 诪讛砖讘讜注. 讬砖 诇讻诐 讛专讘讛 讬讜转专 砖诇讬讟讛 注诇 讛讝诪谉 砖诇讻诐 诪诪讛 砖转诪讬讚 讛讬讛 谞讚诪讛, 讜讻诪讜 砖讗驻砖专 诇谞爪诇 讗讜转讛 讻讚讬 诇讘诇讜转 讬讜转专 讝诪谉 诪砖驻讞讛, 讗驻砖专 讬讛讬讛 (讻砖讛讬诇讚讬诐 讞讜讝专讬诐 诇诪住讙专讜转) 诇谞爪诇 讗讜转讛 讻讚讬 诇诇诪讜讚 讟讻谞讜诇讜讙讬讜转 讞讚砖讜转, 诇讛转讞讬诇 诇讻转讜讘 讘讚讬拽讜转 讗讜讟讜诪讟讬讜转 讜诇讘谞讜转 转讛诇讬讻讬 注讘讜讚讛 讟讜讘讬诐 讬讜转专 讘讞讘专讛 砖诇讻诐.

ToCode
1 419
## 讞讬讘讜专 诇专讬讗拽讟 讻诇 讛注讘讜讚讛 讛讝讗转 诪转讞讘专转 诇 React 讘爪讜专讛 诪诪砖 驻砖讜讟讛 讘讗诪爪注讜转 hook 讘砖诐 useMachine. 驻讜谞拽爪讬讛 讝讜 诪讞讝讬专讛 诇谞讜 砖谞讬 诪砖转谞讬诐: 讛专讗砖讜谉 谞拽专讗 current 讜诪讬讬爪讙 讗转 讛住讟讬讬讟 讛谞讜讻讞讬, 讜讛砖谞讬 谞拽专讗 send 讜讘注讝专转讜 谞讜讻诇 诇砖诇讜讞 讗讬专讜注讬诐 诇诪讻讜谞讛. 诇讚讜讙诪讛 讘砖讘讬诇 诇砖诇讜讞 讗讬专讜注 PLAY 诇诪讻讜谞讛 砖讬转讞讬诇 诇讛爪讬讙 诪讞讚砖 讗转 专爪祝 讛爪讘注讬诐 讻诇 诪讛 砖讗谞讬 爪专讬讱 诇注砖讜转 讛讜讗:
send("PLAY");
讗转 讛诪砖转谞讬诐 sequence 讜 currentIndex 诪转讜讱 讛讝讬讻专讜谉 砖诇 讛诪讻讜谞讛 讗谞讬 拽讜专讗 讚专讱 诪砖转谞讛 context 砖诇 讛住讟讬讬讟 讛谞讜讻讞讬:
  const [current, send] = useMachine(machine);
  const { sequence, currentIndex } = current.context;
砖诐 讛住讟讬讬讟 讛谞讜讻讞讬 讛讜讗 current.value 讜讛讗讬专讜注 砖讘讙诇诇讜 讛讙注转讬 诇住讟讬讬讟 讛谞讜讻讞讬 讛讜讗 current.event. 讗转诐 诪讜讝诪谞讬诐 诇专讗讜转 讗转 讛拽讜讚 讛诪诇讗 砖诇 讛讞讬讘讜专 诇专讬讗拽讟 讘拽讜讚住谞讚讘讜拽住 讘拽讬砖讜专 https://codesandbox.io/s/wonderful-worker-pyozo. ## 专讙注, 讝讛 诇讗 讚讜诪讛 拽爪转 诇 redux? 讘注讘讜讚讛 注诐 xstate 讬砖 讛专讘讛 讚讘专讬诐 砖诪讝讻讬专讬诐 讗转 Redux: 1. 讛诇讜讙讬拽讛 谞砖诪专转 讘拽讜讘抓 谞驻专讚 讜讗谞讞谞讜 谞讬讙砖讬诐 讗诇讬讛 讚专讱 Hook 砖诇 讛住驻专讬讛, 诪讛 砖诪砖讞专专 讗转 专讬讗拽讟 诇讛转诪拽讚 专拽 讘拽讜讚 讛转爪讜讙讛 2. 讛诇讜讙讬拽讛 注爪诪讛 诪拽讘诇转 "讗讬专讜注讬诐" 讜诪谞讛诇转 诪爪讘 驻谞讬诪讬 诇驻讬 讛讗讬专讜注讬诐 砖谞讻谞住讜 诇诪讻讜谞讛. 3. 讗谞讞谞讜 诪讗讜讚 诪讜讙讘诇讬诐 讘转拽砖讜专转 注诐 讛诇讜讙讬拽讛 讜讬讻讜诇讬诐 专拽 "诇砖诇讜讞" 讗讬专讜注讬诐 讻讚讬 诇讙专讜诐 诇诪讻讜谞讛 诇注砖讜转 讚讘专讬诐. 4. 讗讬专讜注讬诐 诪住讜讬诪讬诐 砖谞砖诇讞 讬讙专诪讜 诇 Side Effects (讻诇讜诪专 诇讬爪讬专转 "驻注讜诇讜转"). 讘拽讜讚 讛讚讜讙诪讛 砖诇谞讜 讗诇讛 讛讬讜 砖注讜谞讬诐 讜讘诪拽讜诪讜转 诪转讜讞讻诪讬诐 讬讜转专 谞讜讻诇 诇诪爪讜讗 讘拽砖讜转 专砖转. 讘 Redux 讛讬讬谞讜 诪砖转诪砖讬诐 讘 Middlewares 讻讚讬 诇讛讙讚讬专 讗讬讝讛 讗讬专讜注讬诐 砖谞讻谞住讬诐 讬驻注讬诇讜 Side Effects. 5. 注讚讻讜谉 讛诪讬讚注 拽讜专讛 专拽 讚专讱 讛讻诇讬诐 砖诇 xstate, 讜讛诪讬讚注 讻讜诇讜 讛讜讗 Immutable, 讘讚讜诪讛 诇 Redux 砖诐 注讚讻讜谉 讛诪讬讚注 拽讜专讛 讘讗诪爪注讜转 讛讞讝专转 住讟讬讬讟 诪注讜讚讻谉 诪讛 Reducer. 讛讚讬诪讬讜谉 拽讬讬诐 讻讬 讙诐 Redux 讛讜讗 住讜讙 砖诇 诪讻讜谞转 诪爪讘讬诐 讜诪住驻拽 驻讜谞拽爪讬讜谞讗诇讬讜转 诪讗讜讚 讚讜诪讛. 讛讛讘讚诇 讛诪专讻讝讬 讛讜讗 讘讙讬砖讛 讛讚拽诇专讟讬讘讬转 砖诇 xstate 砖诪讙讚讬专 讗转 诪注讘专讬 讛诪爪讘讬诐 讘讗诪爪注讜转 JSON 讜诇讗 讘讗诪爪注讜转 拽讜讚, 讜诇讻谉 拽诇 讬讜转专 诇讻转讜讘 讻诇讬诐 讗讜讟讜诪讟讬讬诐 诇讜讬讝讜讗诇讬讝爪讬讛 砖诇 诪注讘专讬 诪爪讘讬诐 讗诇讛. 讻诪讜 讻谉 讛讻转讬讘 讛诪驻讜专砖 讘 JSON 讗讜诪专 砖讻诇 诪注讘专 诪爪讘 讛讜讗 诪讻讜讜谉, 讻讱 砖讬讛讬讜 驻讞讜转 讘讗讙讬诐 砖诇 讛讙注讛 诇诪爪讘 诇讗 讞讜拽讬. 讜讗讜诇讬 讛讛讘讚诇 讛诪砖诪注讜转讬 讘讬讜转专 讛讜讗 砖 Redux 诪注讜讚讚 讗讜转谞讜 诇砖诪讜专 讗转 讻诇 讛住讟讬讬讟 砖诇 讛讬讬砖讜诐 讘 Store 讬讞讬讚, 讜诇注讜诪转讜 XState 诪注讜讚讚 讛讙讚专转 诪住驻专 诪讻讜谞讜转 诪爪讘讬诐 注讘讜专 讞诇拽讬诐 砖讜谞讬诐 讘讬讬砖讜诐.

ToCode
1 419
      entry: actions.send("TICK", { delay: 200, id: "autoplayTimer" }),
      on: {
        TICK: {
          target: "autoplay"
        }
      }
    },
    idle: {
      entry: actions.cancel("autoplayTimer")
    },
    flash: {
      entry: actions.send("TICK", { delay: 200 }),
      on: {
        TICK: "idle"
      }
    }
  }
});

讘讜讗讜 谞驻专拽 讗转 讛拽讜讚 讛讝讛 诇拽讟注讬诐 讻讚讬 诇讛讘讬谉 诪讛 拽讜专讛 砖诐. 讻讚讬 诇讬爪讜专 诪讻讜谞转 诪爪讘讬诐 讗谞讞谞讜 诪注讘讬专讬诐 讗讜讘讬拽讟 诪讬讚注 诇驻讜谞拽爪讬讛 createMachine 砖诇 xstate. 讛砖讚讜转 讛专讗砖讜谞讬诐 讘讗讜讘讬拽讟 讛诐 砖讚讜转 诪讬讚注 讻诇诇讬 讜诪讙讚讬专讬诐 讗转 诪讝讛讛 讛诪讻讜谞讛, 讗转 讛诪爪讘 讛讛转讞诇转讬 砖诇讛 讜讗转 讛讝讬讻专讜谉 注诐 讛注专讻讬诐 讛专讗砖讜谞讬诐 砖讬讬讻转讘讜 讗诇讬讜:
  id: "simon",
  initial: "autoplay",
  context: {
    sequence: [1, 1, 2, 3],
    currentIndex: 0
  },
讛诪驻转讞 states 诪转讗专 讗转 讻诇 讛诪爪讘讬诐 讜讛诪注讘专讬诐 讘讬谞讬讛诐. 砖讬诪讜 诇讘 诇诪驻转讞讜转 讘诇讘讚 讘转讜讻讜: autoplay, pause, idle, flash. 讻诇 诪讛 砖讬砖 诇谞讜 讘诪砖讞拽 讘注爪诐 诪住转讻诐 讘-4 诪爪讘讬诐. 诪爪讘 idle 讛讜讗 讛诪爪讘 讛驻砖讜讟 砖诇 "诪讞讻讛 诇拽诇讟". 讛诪讻讜谞讛 讻讗谉 诇讗 注讜砖讛 讻诇讜诐 讜专讬讗拽讟 讬爪讟专讱 诇讛爪讬讙 讗转 讻诇 讛爪讘注讬诐 诪讻讜讘讬诐. 讛谞讛 讛拽讜讚 砖诪转讗专 讗讜转讜:
    idle: {
      entry: actions.cancel("autoplayTimer")
    },
讛诪爪讘讬诐 讛讬讜转专 诪注谞讬讬谞讬诐 讛诐 autoplay 讜 pause. 诪爪讘讬诐 讗诇讛 诪转讗专讬诐 讗转 诪谞讙谞讜谉 讛爪讙转 专爪祝 讛爪讘注讬诐, 讻讗砖专 讘诪爪讘 autoplay 转讛讬讛 诇谞讜 诪谞讜专讛 讚讜诇拽转 讘 GUI, 讜讘诪爪讘 pause 讻诇 讛谞讜专讜转 讬讛讬讜 讻讘讜讬讜转 诇爪讜专讱 讛驻住拽讛 拽爪专讛 讘讬谉 讛爪讙转 讛爪讘注讬诐. 讛讗讬专讜注 TICK 讛讜讗 砖诪注讘讬专 讘讬谉 讛诪爪讘讬诐:
    autoplay: {
      entry: actions.send("TICK", { delay: 1000, id: "autoplayTimer" }),
      on: {
        TICK: {
          target: "pause",
          actions: assign({
            currentIndex: (context, event) => context.currentIndex + 1
          })
        }
      },
      always: [
        {
          target: "idle",
          cond: ({ currentIndex, sequence }) => currentIndex >= sequence.length
        }
      ]
    },
    pause: {
      entry: actions.send("TICK", { delay: 200, id: "autoplayTimer" }),
      on: {
        TICK: {
          target: "autoplay"
        }
      }
    },
讜讘讜讗讜 谞拽专讗 讗转 讝讛 诇讗讟: 1. 讘诪爪讘 autoplay 讗诐 讛转拽讘诇 讗讬专讜注 TICK 讬砖 诇注讘讜专 诇诪爪讘 pause, 讜讙诐 诇讛驻注讬诇 "驻注讜诇讛 驻谞讬诪讬转" 砖诇 注讚讻讜谉 讛讝讬讻专讜谉 - 拽讬讚讜诐 讛讗讬谞讚拽住 讘专爪祝 讘-1. 2. 讘诇讜拽 always 讘诪爪讘 autoplay 讗讜诪专 砖讗诐 谞讻谞住转讬 诇诪爪讘 讝讛 讗讘诇 讛转谞讗讬 诪转拽讬讬诐, 讻诇讜诪专 讛讗讬谞讚拽住 讛谞讜讻讞讬 讙讚讜诇 讗讜 砖讜讜讛 诇诪住驻专 讛爪讘注讬诐 讘专爪祝, 讗讝 爪专讬讱 诇注讘讜专 讗讜讟讜诪讟讬转 诇诪爪讘 idle. 3. 讘诪爪讘 pause 讗诐 讛转拽讘诇 讗讬专讜注 TICK 讬砖 诇注讘讜专 诇诪爪讘 autoplay. 谞砖讗专谞讜 注诐 讛诪驻转讞 entry: 诪驻转讞 讝讛 诪转讗专 驻注讜诇讜转 驻谞讬诪讬讜转 砖讛诪讻讜谞讛 诪讬讬爪专转 讘讻谞讬住讛 诇诪爪讘 讛诪转讗讬诐. 讘拽讜讚 砖诇讬 讘讻谞讬住讛 诇诪爪讘 autoplay 讗谞讬 诪转讞讬诇 砖注讜谉 砖诇 砖谞讬讛 讗讞专讬讜 讬讬砖诇讞 讘爪讜专讛 讗讜讟讜诪讟讬转 讗讬专讜注 TICK; 讘讻谞讬住讛 诇诪爪讘 pause 砖讜讘 讬讜驻注诇 砖注讜谉 砖诇 200 诪讬诇讬 砖谞讬讜转 讘住讬讜诪讜 讬讬砖诇讞 讗讬专讜注 TICK. 讛驻注讜诇讜转 讛驻谞讬诪讬讜转 砖诇 讛诪讻讜谞讛 诪讗驻砖专讜转 诇讬 诇讟驻诇 讘拽讜讚 砖拽砖讜专 诇讝诪谉 讘爪讜专讛 谞讜讞讛. ## 诪讬诪讜砖 驻讬讚讘拽 诇诪砖转诪砖 讗讞专讬 诇讞讬爪讛 讘讻诇 专讙注 谞转讜谉 讜讻转讜爪讗讛 诪驻注讜诇讜转 讘诪诪砖拽 讛诪砖转诪砖 讬讻讜诇讬诐 诇讛讬讻谞住 诇诪讻讜谞讛 砖诇讬 讗讬专讜注讬诐 讞讚砖讬诐: 诪砖转诪砖 砖诪讘拽砖 注讻砖讬讜 诇专讗讜转 诪讛讛转讞诇讛 讗转 专爪祝 讛讗讜专讜转 讬砖诇讞 讗讬专讜注 PLAY 诇诪讻讜谞讛, 讜诪砖转诪砖 砖诪讘拽砖 诇讛转讞讬诇 诇诇讞讜抓 注诇 讛讻驻转讜专讬诐 讛爪讘注讜谞讬讬诐 讘注爪诪讜 讬驻注讬诇 讗转 讗讬专讜注 FLASH. 讘讙诇诇 砖讗讬专讜注讬诐 讗诇讛 讬讻讜诇讬诐 诇讛讙讬注 讘讻诇 诪爪讘 讜爪专讬讻讬诐 讟讬驻讜诇 诪讬讬讚讬 诇讗 诪砖谞讛 诪转讬 讛诐 讛讙讬注讜, 讜讘讙诇诇 砖讛讟讬驻讜诇 讘讛诐 讝讛讛 讘诇讬 转诇讜转 讘诪爪讘 讘讜 讛讬讬谞讜 讻砖讛诐 讛转拽讘诇讜, 讻转讘转讬 讗转 拽讜讚 讛讟讬驻讜诇 讘砖谞讬 讛讗讬专讜注讬诐 讘诪拽讜诐 诪专讻讝讬 讘诪驻转讞 on 砖诇 讛诪讻讜谞讛 讻讜诇讛:
  on: {
    PLAY: {
      target: "autoplay",
      actions: [
        actions.cancel("autoplayTimer"),
        assign({ currentIndex: (context, event) => 0 })
      ]
    },
    FLASH: {
      target: "flash",
      actions: [
        actions.cancel("autoplayTimer"),
        assign({
          currentIndex: (context, event) => 0
        })
      ]
    }
  },
讗谞讞谞讜 讻讘专 讬讜讚注讬诐 诇拽专讜讗 讗转 讝讛: 1. 讗诐 讛转拽讘诇 讗讬专讜注 PLAY, 诇讗 诪砖谞讛 讘讗讬讝讛 诪爪讘 讛讬讬谞讜, 讬砖 诇注讘讜专 诇诪爪讘 autoplay, 诇讘讟诇 讗转 讛砖注讜谉 autoplayTimer 讜诇讗驻住 讗转 诪砖转谞讛 currentIndex. 2. 讗诐 讛转拽讘诇 讗讬专讜注 FLASH, 诇讗 诪砖谞讛 讘讗讬讝讛 诪爪讘 讛讬讬谞讜, 讬砖 诇注讘讜专 诇诪爪讘 flash 讜砖讜讘 诇讘讟诇 讗转 讛砖注讜谉 autoplayTimer 讜诇讗驻住 讗转 诪砖转谞讛 currentIndex. 讜诇住讬讜诐 诪爪讘 flash 注爪诪讜 谞专讗讛 讻讱:
    flash: {
      entry: actions.send("TICK", { delay: 200 }),
      on: {
        TICK: "idle"
      }
    }

ToCode
1 419
# 住讬讜专 拽爪专 讘 XState 诇爪讜专讱 驻讬转讜讞 诪砖讞拽 住讬讬诪讜谉 诇驻谞讬 讻诪讛 讬诪讬诐 讻转讘转讬 讻讗谉 注诇 驻讬转讜讞 诪砖讞拽 住讬讬诪讜谉 讘 React. 讘驻讜住讟 讛爪讘注转讬 注诇 讛拽讜砖讬 讘讻转讬讘转 拽讜诪驻讜谞谞讟讜转 专讬讗拽讟 讛讻讜诇诇讜转 讗诇诪谞讟 砖诇 讝诪谉 讗讜 诪注讘专 诪讜专讻讘 讘讬谉 诪爪讘讬诐. 讘诪拽专讛 砖诇 住讬讬诪讜谉 讛讬讜 诇谞讜 讗转 讛诪爪讘讬诐 讛讘讗讬诐: 1. 讛拽讜诪驻讜谞谞讟讛 讬讻讜诇讛 诇讛讬讜转 讘诪讛诇讱 讛爪讙转 专爪祝 讛爪讘注讬诐 讛讗拽专讗讬 砖讛诪讞砖讘 讘讞专 2. 讘诪讛诇讱 讛爪讙转 爪讘注 诪讛专爪祝 讬讻讜诇 诇讛讬讜转 砖诪砖转诪砖 讬诇讞抓 注诇 讗讞讚 讛讻驻转讜专讬诐 讜讗讝 谞驻住讬拽 诇讛爪讬讙 讗转 讛专爪祝 讜谞讬转谉 诇诪砖转诪砖 诇讛拽诇讬讚 讗转 讛专爪祝 砖诇讚注转讜 讛讜讗 讛谞讻讜谉 3. 讗驻砖专讜转 砖谞讬讛 讘诪讛诇讱 讛爪讙转 爪讘注 诪讛专爪祝 讛讬讗 砖讗祝 讗讞讚 诇讗 谞讜讙注 讜讗讝 爪专讬讱 诇讛诪砖讬讱 诇讛爪讬讙 讗转 讛爪讘注 讛讘讗 4. 讗讘诇 讗诐 讗谞讞谞讜 诪爪讬讙讬诐 讗转 讛爪讘注 讛讗讞专讜谉 讘专爪祝 爪专讬讱 诇注爪讜专 讜诇讞讻讜转 砖诪砖转诪砖 讬转讞讬诇 诇讛拽诇讬讚 讗转 讛专爪祝 砖诇讜 讗讜 讬诇讞抓 注诇 讻驻转讜专 "讛爪讙 砖讜讘" 5. 讘谞讜住祝 讘诪讛诇讱 讛爪讙转 讛爪讘注讬诐 诪讛专爪祝 讛讗拽专讗讬 讜讘讬谉 讻诇 砖谞讬 爪讘注讬诐 爪专讬讱 诇讻讘讜转 讗转 讻诇 讛诪谞讜专讜转 诇讻诪讛 诪讗讬讜转 砖谞讬讛 讻讚讬 诇转转 诇诪砖转诪砖 诇讛讘讚讬诇 讘讬谉 讛爪讘注讬诐. 讗诐 驻住驻住转诐 讗转 讗讜转讜 驻讜住讟 讗转诐 诪讜讝诪谞讬诐 诇讞讝讜专 讗诇讬讜 讜诇专讗讜转 讗转 讛诪讬诪讜砖 砖讻转讘转讬 讘专讬讗拽讟 诇诪注讘专讬 讛诪爪讘讬诐 讛讗诇讛. 讗诐 讗转诐 讝讜讻专讬诐 诪讛 讛诇讱 砖诐 讜诪讞驻砖讬诐 讙讬砖讛 谞讜住驻转 诇讻转讬讘转 拽讜诪驻讜谞谞讟讜转 诪住讜讙 讝讛 讛讙注转诐 诇诪拽讜诐 讛谞讻讜谉. 讘驻讜住讟 讝讛 讗爪讬讙 讗转 住驻专讬讬转 xstate 诇诪讬诪讜砖 诪讻讜谞转 诪爪讘讬诐 讘住讘讬讘转 JavaScript 讜谞专讗讛 讗讬讱 讛讬讗 转注讝讜专 诇谞讜 讘讻转讬讘转 诪砖讞拽 住讬讬诪讜谉. ## 注拽专讜谞讜转 诪专讻讝讬讬诐 砖诇 xstate 砖讛砖转诪砖转讬 讘讛诐 讘讻转讬讘转 讛诪砖讞拽 讛住驻专讬讛 xstate 讛讬讗 住驻专讬讛 诇诪讬诪讜砖 诪讻讜谞讜转 诪爪讘讬诐 讘 JavaScript. 诪讻讜谞转 诪爪讘讬诐 讛讬讗 诪注专讻转 砖诪讻讬诇讛 诪住驻专 "诪爪讘讬诐" 讜讛讙讚专讛 诇诪注讘专讬诐 讘讬谞讬讛诐. 讘讘谞讬讬转 诪讻讜谞转 诪爪讘讬诐 讗谞讞谞讜 诪讙讚讬专讬诐 诪讛 讛诪爪讘讬诐 讛砖讜谞讬诐, 诪讛 讬讻讜诇 诇拽专讜转 讘讻诇 诪爪讘 讜诇讗讬讝讛 诪爪讘 爪专讬讱 诇注讘讜专 讘注拽讘讜转 讻诇 讗讬专讜注. 诇驻注诪讬诐 (讻诪讜 讘 xstate) 诇诪讻讜谞转 诪爪讘讬诐 讬砖 讙诐 "讝讬讻专讜谉" 砖讝讛 讗讜讘讬拽讟 诪讬讚注 砖讛诪爪讘讬诐 讛砖讜谞讬诐 讬讻讜诇讬诐 诇拽专讜讗 诪诪谞讜 讜诪注讘专讬 诪爪讘讬诐 诪住讜讬诪讬诐 讬讻讜诇讬诐 诇注讚讻谉 讗讜转讜. 讘 xstate 诪注讘专讬 诪爪讘讬诐 讛诐 转讜爪讗讛 砖诇 "讗讬专讜注讬诐". 讛讗讬专讜注讬诐 讬讻讜诇讬诐 诇讛讙讬注 诪讘讞讜抓 讗讜 讻转讜爪讗讛 诪"驻注讜诇讜转" 砖诪讻讜谞转 讛诪爪讘讬诐 注爪诪讛 诪讬讬爪专转. 诇讚讜讙诪讛 讘讜讗讜 谞讚讘专 注诇 谞讬讙讜谉 专爪祝 讛爪讘注讬诐 讛讗拽专讗讬- 谞讜讻诇 诇讛讙讚讬专 诪爪讘 "诪爪讬讙 爪讘注", 诪爪讘 "讛驻住拽讛 讘讬谉 爪讘注讬诐" 讜诪爪讘 "idle", 讜讘谞讜住祝 诇讛讙讚讬专 讗讜讘讬拽讟 讝讬讻专讜谉 诇诪讻讜谞讛 砖讻讜诇诇 讗转 专爪祝 讛爪讘注讬诐 讛讗拽专讗讬 讜讗转 讛讗讬谞讚拽住 砖讻专讙注 讗谞讞谞讜 诪爪讬讙讬诐 诪转讜讱 讛专爪祝. 拽讜讚 讞讬爪讜谞讬 砖讬讘拽砖 诇讛转讞讬诇 诇讛爪讬讙 讗转 专爪祝 讛爪讘注讬诐 讬砖诇讞 讗讬专讜注 PLAY 讜讘转讙讜讘讛 讗谞讞谞讜 谞讗驻住 讗转 讛讗讬谞讚拽住 讜谞讬讻谞住 诇诪爪讘 "诪爪讬讙 爪讘注". 讘讗讜驻谉 讗讜讟讜诪讟讬 讘讻谞讬住讛 诇诪爪讘 "诪爪讬讙 爪讘注" 谞砖讬诐 砖注讜谉 砖讘注讜讚 砖谞讬讛 讬注讘讜专 讗讜转谞讜 诇诪爪讘 "讛驻住拽讛 讘讬谉 爪讘注讬诐". 讘讻谞讬住讛 诇诪爪讘 "讛驻住拽讛 讘讬谉 爪讘注讬诐" 谞砖讬诐 砖注讜谉 砖注讜讚 200 诪讬诇讬 砖谞讬讜转 讬注讘讬专 讗讜转谞讜 讞讝专讛 诇诪爪讘 "诪爪讬讙 爪讘注" 讜讻讱 注讚 砖住讬讬诪谞讜 诇讛爪讬讙 讗转 讻诇 讛爪讘注讬诐 讻讬 讗讝 谞注讘讜专 讞讝专讛 诇诪爪讘 idle. 住驻专讬讬转 xstate 转注讝讜专 诇讬 诇拽讞转 讗转 讛转讬讗讜专 讛诪讬诇讜诇讬 讜诇讻转讜讘 讗讜转讜 讘拽讜讚 讻讱 砖专讬讗拽讟 诇讗 讬爪讟专讱 诇讛转注住拽 注诐 讛诇讜讙讬拽讛 讛注住拽讬转 砖诇 讛诪砖讞拽 讜讛拽讜诪驻讜谞谞讟讛 转讜讻诇 诇讛转诪拽讚 专拽 讘诇讜讙讬拽讛 讛讞讝讜转讬转 砖诇 讛爪讙转 讛诪讬讚注 注诇 讛诪住讱. 讗转 讛诇讜讙讬拽讛 砖讗谞讬 讻讜转讘 讘 xstate 讙诐 讛专讘讛 讬讜转专 拽诇 诇讘讚讜拽 讗讜 诇讛专讞讬讘 讘讛砖讜讜讗讛 诇拽讜讚 砖转拽讜注 讘转讜讱 拽讜诪驻讜谞谞讟讛. 诪爪讚 砖谞讬 讜讘讙讬讝专转 讛讞住专讜谞讜转 - 讛住驻专讬讛 讻讜诇诇转 讛专讘讛 诪讜砖讙讬诐 讜专注讬讜谞讜转 讞讚砖讬诐, 讚讜专砖转 讝诪谉 诇讬诪讜讚 讜诇驻讞讜转 诪讛专讜砖诐 砖诇讬 诇讗 转诪讬讚 拽诇 诇讚讘讙 讗转 讻诇 讛谞转讬讘讬诐 讘拽讜讚. ## 诪讬诪讜砖 谞讬讙讜谉 专爪祝 讛爪讘注讬诐 注诐 讛驻住拽讜转 讘讬谉 讛爪讘注讬诐 谞注讘讜专 诇拽讜讚. 转讞讬诇讛 讗讚讘讬拽 讻讗谉 讗转 拽讜讚 讛诪讻讜谞讛 讛诪诇讗 讜诇讗讞专 诪讻谉 讗讚讘讬拽 拽讟注 拽讟注 诪转讜讻讜 注诐 讛住讘专讬诐:
const { actions, createMachine, assign } = require("xstate");

// Stateless machine definition
// machine.transition(...) is a pure function used by the interpreter.
export default createMachine({
  id: "simon",
  initial: "autoplay",
  context: {
    sequence: [1, 1, 2, 3],
    currentIndex: 0
  },
  on: {
    PLAY: {
      target: "autoplay",
      actions: [
        actions.cancel("autoplayTimer"),
        assign({ currentIndex: (context, event) => 0 })
      ]
    },
    FLASH: {
      target: "flash",
      actions: [
        actions.cancel("autoplayTimer"),
        assign({
          currentIndex: (context, event) => 0
        })
      ]
    }
  },
  states: {
    autoplay: {
      entry: actions.send("TICK", { delay: 1000, id: "autoplayTimer" }),
      on: {
        TICK: {
          target: "pause",
          actions: assign({
            currentIndex: (context, event) => context.currentIndex + 1
          })
        }
      },
      always: [
        {
          target: "idle",
          cond: ({ currentIndex, sequence }) => currentIndex >= sequence.length
        }
      ]
    },
    pause: {

ToCode
1 419
# 讟讬驻 讙讬讟: 转讞专讜转 拽讜诪讬讟讬诐 砖讘讜注讬转 讗讞转 讛驻拽讜讚讜转 讛驻讞讜转 诪讜讻专讜转 讘 git 转讜讻诇 诇注讝讜专 诇讻诐 讻砖转讞讝专讜 诇诪砖专讚, 讗讜 诇驻讞讜转 诇讗诇讛 诪讻诐 砖诪讞讝讬拽讬诐 讘诪砖专讚 诪住讱 讙讚讜诇 讜诪讞驻砖讬诐 住讟讟讬住讟讬拽讜转 诇讛爪讬讙 注诇讬讜. 讗谞讬 诪讚讘专 注诇 讛驻拽讜讚讛 git shortlog 砖诪专讗讛 诇谞讜 讗转 讛拽讜诪讬讟讬诐 讛讗讞专讜谞讬诐 诇驻讬 讛讻讜转讘. 驻诇讟 诇讚讜讙诪讛 讘讛驻注诇讛 诇诇讗 诪转讙讬诐 注砖讜讬 诇讛讬专讗讜转 讻讱:
$ git shortlog

ynonp (4)
    do stuff
    add more stuff
    fix the tests of stuff
    break some stuff
    
johndoe (2)
    break stuff
    fix stuff
讘注讜讚 砖 log 专讙讬诇 诪转诪拽讚 讘专爪祝 讛拽讜诪讬讟讬诐, 讛 shortlog 诪转诪拽讚 讘诪转讻谞转讬诐 诪讗讞讜专讬 讛拽讜诪讬讟讬诐, 讗讜 诇驻讞讜转 诪讗专讙谉 讗转 讛拽讜诪讬讟讬诐 诇驻讬 诪讬 砖讻转讘 讗讜转诐. 讜讛转讞专讜转 砖诇谞讜? 讛驻拽讜讚讛 讛讘讗讛 诪爪讬讙讛 专拽 讗转 讛诪住驻专讬诐 (讘诇讬 驻专讟讬 讛拽讜诪讬讟讬诐 注爪诪诐) 砖诇 拽讜诪讬讟讬诐 诪讛砖讘讜注 讛讗讞专讜谉 讘讻诇 讛注谞驻讬诐:
git shortlog -s --branches --since="1 week ago"
讜讗诐 讗转诐 诪拽专讬谞讬诐 讗转 讝讛 注诇 讛诪住讱 讛讙讚讜诇 转讜讻诇讜 诇讛砖转诪砖 讘 watch 讻讚讬 诇专注谞谉 讗转 讛驻诇讟 驻注诐 讘讬讜诐 讘爪讜专讛 讗讜讟讜诪讟讬转:
watch -n 86400 'git shortlog -s --branches --since="1 week ago"'